El patrón Singleton
Descripción
El patrón Singleton tiene como objetivo asegurar que una clase sólo posee una instancia y proporcionar un método de clase único que devuelva esta instancia.
En ciertos casos es útil gestionar clases que posean una única instancia. En el marco de los patrones de construcción, podemos citar el caso de una fábrica de productos (patrón Abstract Factory) del que sólo es necesario crear una instancia.
Ejemplo
En el sistema de venta online de vehículos, debemos gestionar clases que poseen una sola instancia.
El sistema de documentación que debe entregarse al cliente tras la compra de un vehículo (como el certificado de cesión, la solicitud de matriculación y la orden de pedido) utiliza la clase DocumentaciónEnBlanco que sólo posee una instancia. Esta instancia referencia todos los documentos necesarios para el cliente. Esta instancia única se llama la documentación en blanco pues los documentos a los que hace referencia están todos en blanco. El uso completo de la clase DocumentaciónEnBlanco se explica en el capítulo dedicado al patrón Prototype.
La figura 2-6.1 ilustra el uso del patrón Singleton para la clase DocumentaciónEnBlanco. El atributo de clase instance contiene o bien null o bien la única instancia de la clase DocumentaciónEnBlanco. El método de clase Instance reenvía esta instancia única devolviendo el valor del atributo instance. Si este atributo tiene el valor inicial null, a continuación contiene una referencia hacia la instancia única cuando esta última se crea.
Figura 2-6.1 - El patrón Singleton aplicado a la clase DocumentaciónEnBlanco
Estructura
1. Diagrama de clases
La figura 2-6.2 detalla la estructura genérica del patrón.
Figura 2-6.2 - Estructura del patrón Singleton
2. Participante
El único participante es la clase Singleton que ofrece acceso a la instancia única mediante el método de clase Instance.
Por otro lado, la clase Singleton posee un mecanismo que asegura que sólo puede existir una única instancia. Este mecanismo bloquea la creación de otras instancias.
3. Colaboración
Cada cliente de la clase Singleton accede a la instancia única mediante el método de clase Instance. No puede crear nuevas instancias utilizando el operador habitual de instanciación (operador new) que está bloqueado.
Dominio de uso
El patrón se utiliza en el siguiente caso:
-
Solo debe existir una única instancia de una clase.
-
Esta instancia sólo debe estar accesible mediante un método de clase.
El uso del patrón Singleton ofrece a su vez la posibilidad de utilizar únicamente variables globales.
Ejemplos en C#
1. Documentación en blanco
El código C# completo de la clase DocumentaciónEnBlanco aparece en el capítulo dedicado al patrón Prototype. La sección de esta clase relativa al uso del patrón Singleton se muestra a continuación.
El constructor de esta clase tiene una visibilidad privada de modo que sólo pueda utilizarlo el método Instance. De este modo, ningún objeto externo a la clase DocumentacionEnBlanco puede crear una instancia utilizando el operador new.
Del mismo modo, el atributo _instance también tiene una visibilidad privada para que sólo sea posible acceder a él desde el método de clase Instance.
using System.Collections.Generic;
public class DocumentaciónEnBlanco : Documentacion
{
private static DocumentaciónEnBlanco _instance = null;
private DocumentaciónEnBlanco()
{
documentos = new List<Documento>();
}
public static DocumentaciónEnBlanco Instance()
{
if (_instance == null)
_instance = new DocumentaciónEnBlanco(); ...