miércoles, 6 de febrero de 2013

Singleton Pattern


  • Clasificación del patrón: creacional.
  • Intención: garantiza que una clase tenga únicamente una instancia y proporciona un punto de acceso global a la misma.
  • También conocido como: ---
  • Aplicabilidad: Se utiliza este patrón cuando:
    • debe haber exactamente una instancia de una clase, y debe ser accesible a los clientes desde un punto de acceso conocido. 
    • la instancia única deba ser extensible por medio de subclases, y los clientes deban ser capaces de utilizar una instancia extendida sin modificar su código.
  •  Estructura:
  • Participantes
    • Singleton: es el responsable de crear y mantener una única referencia a si mismo.
    • define una operación getInstance que permite a los clientes acceder a su instancia única. Su constructor debe ser escondido de la interfaz pública (protegido o privado), para que la clase no pueda ser directamente instanciada, o sobreescrito y que llame al método getInstance.
  • Colaboraciones
    • Client-Singleton: los clientes sólo pueden instanciar la clase Singleton através de su método getInstance.
  • Consecuencias
    • Controla el acceso a su única instancia. 
    • Evita contaminar el espacio de nombres de variables globales que almacenan los casos individuales.
    • La clase Singleton puede tener subclases, y es fácil de configurar un cliente con una instancia de esta subclase.
    • Permite un número variable de instancias, utilizando el mismo enfoque.  Sólo tiene que cambiar el método getInstance.
    • Más flexible que clases estáticas, ya que el Singleton puede ser redefinido por las subclases y las clases estáticas no.
  • Implementación
    • Asegurar una única instancia.
      • Sobreescribiendo el constructor.
      • Teniendo una referencia a si mismo.
      • Creando un método que devuelva la única instanca.
    • Elegir una subclase del singleton
      • mediante la inicialización de la variable -instance, con una instancia de la subclase a utilizar.
      • agregando una variable de entorno que permita a getInstance saber, mediante estructuras condicionales, qué tipo de subclase debe instanciar.
      • tomando la implementación de getInstance() de la clase padre (ej. MazeFactory) y ponerla en la subclase.
      • registrando cada subclase Singleton bajo un nombre determinado dentro de un registro. Cuando se necesita un singleton, getInstance() consulta el registro solicitando el singleton por su nombre. El registro busca la correspondiente singleton (si existe) y lo devuelve. Este enfoque libera getInstance() de conocer todas las subclases Singleton posibles.
  • Patrones relacionados
    • Muchos patrones pueden ser implementados utilizando el patrón Singleton, entre ellos Abstract Factory, Builder y Prototype.
  • Motivación

No hay comentarios:

Publicar un comentario