🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Singleton
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

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.

images/2figure8-1.png

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.

images/fig811.PNG

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(); ...