¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. 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 Java
  3. El patrón Singleton
Extrait - Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª edición]
Extractos del libro
Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª 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 vale null, se inicializa previamente mediante la creación de la instancia única.

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:

  • Sólo 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 dejar de utilizar variables globales.

Ejemplos en Java

1. Documentación en blanco

El código Java completo de la clase DocumentacionEnBlanco 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.

import java.util.*;  
public class DocumentacionEnBlanco extends Documentacion  
{  
    private static DocumentacionEnBlanco _instance = null;  
  
    private DocumentacionEnBlanco()  
    {  
        documentos = new ArrayList<Documento>();  
    }  
  
    public static DocumentacionEnBlanco Instance()  
    {  
        if (_instance == null)  
            _instance...