Patrones de diseño creacionales: Singleton
Singleton (o instancia única) está diseñado para restringir la creación de objetos que pertenecen a una clase. Intentando que una clase tenga solo 1 instancia y proporcionando un punto de acceso global a ella.
Este patrón realmente es bastante sencillo, y sería fácil imaginar situaciones.
Evidentemente, habrá que vigilar si el programa crea hilos de ejecución, ya que sólo uno de los hilos logrará crear el objeto…
Vamos con un ejemplo sencillito en php (5):
<?php
class Ejemplo
{
private static $instance;
// privado, para prevenir la creacion de objetos via "new"
private function __construct()
{
echo 'Soy el constructor';
}
public static function singleton()
{
// Se chequea que no haya instancia del objeto antes
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Clone no permitido
public function __clone()
{
trigger_error('Clone no se permite.', E_USER_ERROR);
}
}
?>
Voy a construir una aplicación, probablemente en php o en Java, utilizando unos u otros, y también montaré los UML’s antes de ponerme a ello, así podemos ir comprobando los caminos y buscar los patrones más óptimos.
Saludos, sed felices ^^
Actualización para aclarar un comentario de JuanSa (su twitter):
Algunos ejemplos donde el singleton sería una opción:
- Clases Login: Son implementadas como singletons, y proporcionan un registro de punto de acceso global sin que sea necesario crear un objeto cada vez que se lleva a cabo.
- Configuración de Clases: Para diseñar las clases que proporcionan los ajustes de configuración de na aplicación. No sólo proporcionan un punto de acceso global, ya que también mantienen la instancia como un objeto de caché.
- Acceso a recursos compartidos: Si necesitas trabajar con el puerto serie puedes limitarlo con el singleton.
- Y para mí, el que está claro es el de la Factoría aplicando Singletons: Si diseñas una aplicación con una factoría (los 2 siguientes posts serán para factoría) para generar nuevos objetos, con sus identificaciones, en un entorno multihilo… Podrías utilizar el singleton para no superponer identificadores para 2 objetos distintos. (Pero lo vemos más adelante, eso sí, para mí es el momento más claro de utilizar el Singleton
Sed felices!



Fantástico, claro y directo al grano.
Nunca he tenido muy claro cuales son los casos para los que se recomienda su uso (excepto cuando tienes claro que no quieres que se pueda crear más de una instalacia) por lo que siempre me queda la duda de cuando debería recurrir a sigleton y cuando no. ¿Alguna sugerencia?
JuanSa: 26 julio, 2009 @ 12:03Mil gracias Joan!
JuanSa: 26 julio, 2009 @ 17:09Sí, en general és una bona descripció, però molt breu. Realment, es tracta d’un problema que es resol en temps de disseny.
Sempre s’ha de tenir en compte que un Singleton és un recurs compartit en un sistema multi procés i per tant, s’ha d’assegurar l’accés concurrent i evitar el codi reentrant dins el Singleton.
Respecte del fil que el crea, no té perquè ser així, ja que a l’exeple que poses s’usa la càrrega peressosa (lazy) de manera que la instància es crea a la primera invocació, cosa que no sempre és necessària perquè podries inicialitzar la instància com
private static $instance = new Ejemplo();
i d’aquesta manera la instància es carrega en el moment en que l’intèrpret carrega la classe.
Es recomana usar la càrrega peresosa quan l’ús del Singleton és escàs o quan consumeix grans recursos (memòria, CPU, I/O…) i, tot i així, la primera vegada que es cridi consumirà més temps que la resta.
En general és millor no usar-la si no està justificat… ja saps, l’opimització prematura és el pijor problema de rendiment ;-)
Ah! Per acabar un WikiLink http://es.wikipedia.org/wiki/Singleton
També un bon recull de patrons de disseny una mica menys coneguts que s’usen a programes distribuïts o en vàries capes.
http://java.sun.com/blueprints/patterns/catalog.html
I uns altres patrons una mica més comuns, entre els quals hi ha el Singleton que comentes:
http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
Bon profit! :-D
Paco Ros: 26 julio, 2009 @ 19:34Moltíssimes gràcies per l’aport Paco Ros… En serio, es un honor que apareguis per aquí :)
Ho llegiré i actualitzaré l’apunt amb les teves aportacions :)
Gràcies! en serio
joanballester: 26 julio, 2009 @ 23:50Edité el post para tí JuanSa, a ver si hoy puedo editarlo con toda la info que dió Paco Ros :)
joanballester: 27 julio, 2009 @ 08:03Esto se pone interesante :D
JuanSa: 28 julio, 2009 @ 00:31