Patrón Singleton

Patrón Singleton

Estructura del Patrón Singleton

Categoría de Patrón: Idiom
Categoría de Problema: Creación

Propósito

Garantiza que una sola clase sólo tenga una instancia y proporciona un punto de acceso global a ella.

Motivación

Es importante que algunas clases tengan exactamente una instancia.
¿Cómo lo podemos asegurar y que ésta sea fácilmente accesible?.
Una variable global no previene de crear múltiples instancias de objetos. Una solución mejor es hacer que sea la propia clase la responsable de su única instancia, quien debe garantizar que no se pueda crear ninguna otra (interceptando las peticiones para crear nuevos objetos) y proporcione un modo de acceder a ella.

Aplicabilidad

Usar Singleton cuando:

  1. Deba haber exactamente una instancia de una clase y ésta debe ser accesible a los clientes desde un punto de acceso conocido.
  2. La única instancia debería ser extensible mediante herencia y los clientes deberían ser capaces de usar una instancia extendida sin modificar su código.

Estructura

Singleton.jpg

Participantes

Singleton: Define una operación Instancia que permite que los clientes accedan a su única instancia. Instancia es una operación de clase. Puede ser responsable de crear su única instancia.

Colaboraciones

Los clientes acceden a la instancia de un Singleton exclusivamente a través de la operación Instancia de ésta.

Ventajas

  1. Acceso controlado a la única instancia: Encapsula su única instancia, puede tener un control estricto sobre como y cuando acceden a ella los clientes.
  2. Espacio de nombres reducido: Es una mejora sobre las variables globales. Evita contaminar el espacio de nombres con variables globales que almacenan las instancias.
  3. Permite el refinamiento de operaciones y la representación: Se puede crear una subclase de la clase Singleton, y es fácil configurar una aplicación con una instancia de esta clase extendida, incluso en tiempo de ejecución.
  4. Permite un número variable de instancias: Hace que sea fácil permitir mas de una instancia de la clase. Solo se necesitaría cambiar la operación que otorga acceso a la instancia del Singleton.

Implementación

Class Singleton {
public:
static Singleton* Instancia();
protected:
Singleton();
Private:
Static Singleton* _instancia;
};
La correspondiente implementación es
Singleton* Singleton:: _instancia = 0;
Singleton* Singleton::Instancia () {
if (_instancia == 0) {
_instancia = new Singleton;
}
return _instancia;
}

Los clientes acceden al Singleton exclusivamente a través de la función miembro Instancia. La variable _instancia se inicializa a 0, y la función miembro Instancia devuelve su valor, inicializándola con la única instancia en caso de que sea 0. Instancia usa inicialización perezosa; el valor que devuelve no se crea y se almacena hasta que se accede a él por primera vez.
Nótese que el constructor se declara como protegido. Un cliente que trate de crear una instancia de Singleton directamente obtendrá un error en tiempo de compilación. Esto garantiza que solo se puede crear una instancia.

Patrones relacionados

Muchos patrones pueden implementarse usando Singleton: Abstract Factory, Builder, Prototype, etc.

Fuentes

Erich Gamma. Patrones de Diseño.