martes, 21 de abril de 2015

Singleton

Singleton

Propósito:

Asegurar que una clase tiene una única instancia y proporciona un punto de acceso global a la misma.

Motivación:
  • A veces es importante asegurar que una clase sólo tiene una instancia (por ejemplo una sola cola de impresión, un gestor de ventanas, un sistema de ficheros...).
  • Solución:
          Una variable global: no, ya que no impide crear múltiples objetos.
          Responsabilidad del constructor de la clase.

Aplicabilidad:

Usa el patrón Singleton cuando:
  • Debe haber exactamente una instancia de una clase, que debe ser accesible a los clientes a través de un punto de acceso conocido.
  • La instancia única pueda tener subclases, y los clientes deban ser capaces de usar las subclases sin modificar su propio código.
Estructura:

Participantes:
  • Singleton:

          Define una operación Instance estática que permite a los clientes acceder a su instancia única.
          Puede ser responsable de crear su única instancia.

Consecuencias:
  • Acceso controlado a la instancia única.
  • Espacio de nombres reducido (mejora sobre el uso de variables globales).
  • Permite refinamiento de operaciones (mediante subclases).
  • Permite un número variable de instancias (cambiando la operación de acceso a la instancia singleton).
  • Es más flexible que los métodos (estáticos) de clase.
Implementación: 

public class Singleton { 
    private static Singleton instance = null; 
    protected Singleton() { 
    // este método se define para evitar 
    // la creación de la clase con new 

     } 
   public static Singleton Instance () { 
      // lazy instantiation 
      if (instance==null) 
            instance = new Singleton();
      return instance; 
     } 
}
  • Subclasificación: 

          Especificar en Instance qué subclase concreta instanciar.
          Mover la implementación de Instance a la subclase.
          Registrar los objetos de las subclases en Singleton.

Código de ejemplo:
public class MazeFactory {
    private static MazeFactory _instance = null; 
    protected MazeFactory () {
    }
    static MazeFactory Instance () {
         if (_instance==null) 
             _instance = new MazeFactory(); 
         return _instance; 
     }
    static MazeFactory Instance (String style) {
         if (_instance==null) {
            if (style.equals(“bombed”)
               _instance = new BombedMazeFactory();
           else if (style.equals(“enchanted”))
               _instance = new EnchantedMazeFactory();
           else 
               _instance = new MazeFactory(); 
         }
          return _instance; 
     }  
     // métodos make* 
     // ... 

Usos conocidos:

La clase java.lang.Runtime del API de Java es una clase Singleton, no tiene constructores públicos y se obtiene su única instancia llamando a getRuntime().

Patrones relacionados:

El patrón Singleton se puede combinar con otros muchos, no obstante es muy frecuente utilizarlo junto a patrones Abstract Factory, Builder y Prototype, es decir, para obtener una instancia única que utilizaremos para construir objetos.

También se le ha relacionado con el patrón Cache Management, utilizado para implementar cache de objetos, solo que el patrón Singleton tendría un cache de un solo objeto.

No hay comentarios:

Publicar un comentario