Patrones de diseño

Patrón Singleton








  • Clasificación: patrón creacional.

  • Intención: el patrón Singleton es usado para representar un objeto en una situación donde sólo puede existir una única instancia de dicho objeto y proveer un punto de acceso global a él.

  • Motivación:

    • Algunas veces sólo queremos tener una sola instancia de una clase que exista en el sistema.

    • Necesitamos que esa instancia sea accesible fácilmente.

    • Y también nos queremos asegurar que más de una instancia de la clase no pueda ser creada.



  • Aplicabilidad:

    • Se necesita una sola instancia de una clase y debe ser accesible desde diferentes partes del sistema.

    • La única instancia debería ser extensible mediante herencia y los clientes deberían ser capaces de utilizar una instancia extendida sin modificar su código.



  • Estructura:

  • Clase Singleton
  • Participantes: La clase participante de este patrón es:

    • Singleton (LoadBalancer):

      • Define una operación instanciar que le permite a los usuarios acceder a su única instancia.

      • Es responsable de crear y mantener su única instancia.
        public class Singleton {
        private static Singleton instance = null;
        private Singleton() {}
        public static Singleton getInstance() {
        if (instance == null) instance = new Singleton();
        return instance;
        }
        }






  • Colaboraciones: Los clientes acceden a la instancia única a través del método Instancia del Singleton.

  • Implementación:

    • La clase se implementa de tal forma que sólo se pueda crear una instancia.

    • Se utiliza un método de clase (static) para ocultar la operación de creación para garantizar la creación de una instancia.

    • Este método tiene acceso a la variable que contiene la instancia y asegura que está inicializada antes de devolver el valor.



  • Consecuencias:

    • Se tiene un acceso controlado a la instancia única.

    • Espacio de nombres reducido. Es una mejora de las variables globales, con lo que evita tener estas variables guardando casos únicos.

    • Permite el refinamiento de operaciones y la representación.

    • Permite un número variable de instancias.

    • Tendencia a abusar en su utilización, por su sencillez, en casos en los que no hace falta.

    • Puede resultar difícil crear una subclase de un Singleton, ya que esto sólo puede funcionar si la clase base Singleton no ha sido todavía instanciada.

    • Se puede cambiar fácilmente el código de un Singleton para permitir un pequeño número de instancias, siempre y cuando esté pertmitido y tenga sentido.



  • Usos conocidos:

    • Clases para almacenar atributos de sesión.

    • Parámetros de la base de datos.

    • Dispositivos de visualización.

    • Gestores de ventana, administrador de tareas, etc.



  • Patrones relacionados:

    • Abstract Factory: usado a menudo para retornar objetos únicos.

    • Builder: usado para construir un objeto complejo, donde un singleton cumple la función de crear un objeto de acceso global.

    • Prototype: usado para copiar un objeto o crearlo desde su prototipo, donde un singleton asegura que sólo un prototipo está garantizado.



  • Problemas:

    • La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución.

    • Si 2 hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto.

    • La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.




Problema en ambientes multithread:


Solución:
Para evitar que 2 o más hilos intenten instanciar la clase vamos a hacer que el método que nos devuelve la instancia de la clase esté sincronizado, esto lo hacemos mediante la palabra reservada "synchronized". Ya prodemos estar seguros que solamente un solo hilo podrá instanciar a la clase Singleton.
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public synchronized static Singleton getInstance() {
if(instance == null) instance = new Singleton();
else System.out.println("No se puede seguir instanciando la clase Singleton");
return instance;
}
}

Patrón Builder






No hay comentarios:

Publicar un comentario