Lilypie Primer PicLilypie Primer Ticker

jueves, 22 de marzo de 2007

Patrones de Diseño: Singleton

Este post marca el inicio de una serie que cubrirá los 23 patrones de diseño definidos en el libro "Design Patterns: Elements of Reusable Object Oriented Software" de Gamma, Helm, Johnson y Vlissides, más conocidos como  La Banda de los Cuatro (Gang of Four o GoF).

Empezaré con uno de los patrones más fáciles de implementar: el Patrón Singleton.

Según el libro de Dessign Patterns, el propósito del patrón Singleton es:

Asegurarse que una clase tiene solamente una instancia, y provee un punto de acceso global a ella.

Conozco dos formas de implementar este patrón:

  • Hacer privados los constructores de la clase e implementar un método estático que cree las instancias.
  • Implementar los mecanismos de control en los constructores de la clase.

Se recomienda usar el primer enfoque, porque es preferible tener un método especializado que implemente el patrón Singleton y dejar que el constructor haga las cosas que se supone que debe hacer: Inicializar las propiedades del objeto.

A manera de ejemplo, imaginemos que estamos creando un juego de Pacman, es lógico pensar que en nuestro juego debe existir UN y solo UN Pacman, entonces es una buena oportunidad para implementar un patrón Singleton, asi:

 

class Pacman
{
#region Patron Singleton
private static Pacman instancia = null;
public static Pacman Create()
{
if (instancia == null)
instancia = new Pacman();
return instancia;
}
#endregion

private Pacman()
{
// Inicializar Objeto
}
}

Podemos ver que hemos declarado el constructor como private de modo que no sea accesible desde el exterior de la Clase.

La implementación del patrón Singleton es bastante directa. Toda la acción ocurre en el método Create que inspecciona el valor de la variable instancia para determinar si debe crear o no una instancia de la Clase Pacman. Si no existe (si instancia == null), entonces se crea una nueva instancia y la almacena en el campo instancia. Si ya existe una instancia, entonces esa instancia será devuelta

Entonces, si intentamos crear una instancia de la clase Pacman usando el constructor, de esta manera:

Pacman p = new Pacman(); 

Obtenemos un error pues el constructor solo es accesible desde el interior de la Clase.

La única forma de obtener nuestro Pacman, es mediante el método Create asi:

Pacman p = Pacman.Create(); 

Una posible variante del método Create, es hacer que se lance una excepción cundo se intente crear más de una instancia.

 

 


3 comentarios:

Anónimo dijo...

Excelente tutorial, muy claro.

Muchas Gracias.

Anónimo dijo...

anonimo sos pariente del que escribio? es malisimo el tutorial

berserker dijo...

en alguna otra pagina, seguiste el tutorial estoy interesado en el resto de los 22 patrones de diseño que faltan te agradezco y muy bien explicado.