http://migueljaque.com
Notas sobre Metodologías Ágiles
Estás en:   Inicio Patrones GoF Singleton - Instancia Única
Singleton - Instancia Única PDF Imprimir E-mail
Domingo, 23 de Marzo de 2008 10:59

Problema: Garantizar que se instanciará un único objeto de una clase.

Solución: Prohibir el acceso al constructor y proveer un método estático que devuelva una referencia al objeto.

Ejemplo:

Ejemplo de implementación del patrón Singleton en PHP5.

 <?php   
class Singleton {
private static $instancia; //Referencia a la instancia.

private function __construct(){
//El constructor es privado.
//... código de construcción
}

public static function verInstancia(){
if(self::$instancia === null) self::$instancia = new self;
return self::$instancia;
}

public function __clone(){
throw new Exception("Clonar un Singleton puede no ser una buena idea.");
}
}

// Se utiliza así...
$instanciaLocal = Singleton::verInstancia();

?>

Puedes encontrar ejemplos de implementación en otros lenguajes aquí.

Diferencia entre Singleton y Clase Estática

Puede que al necesitar una instancia única se nos vengan a la cabeza los conceptos de clase estática o incluso variable global. Pero no son lo mismo que un Singleton. Veamos las diferencias.

En primer lugar está la diferencia semántica: un Singleton es un patrón ("una buena práctica de diseño") mientras que una clase estática o una variable global pueden ser formas de implementar ese patrón (quizás no las mejores). Es decir, que no es lo mismo un patrón que la forma que elegimos para implementarlo.

Pero hay más diferencias, diferencias de comportamiento. Respecto al uso de una clase estática frente a la solución propuesta, la clase estática no tiene constructor. Y, lo que es más importante, no se adapta al cambio (que es el objetivo fundamental de los patrones). Si optamos por utilizar una clase estática y luego nos vemos obligados a sustituirla por una clase dinámica... estamos perdidos. Tendremos que rehacer todas las llamadas a la clase a lo largo del sistema.

Además, si optamos por implementar el Singleton como una clase estática, tampoco podremos derivarla...

Son notables diferencias de comportamiento que ponen de manifiesto que son las "buenas prácticas de diseño".

Actualizado ( Sábado, 19 de Abril de 2008 18:16 )
 

Apoyo a la Cultura Libre: Si eres legal ¡¡COMPARTE!!