Tiempo de lectura: 3 minutos

Patrones de diseño: Patrón Singleton

El patrón Singleton es un patrón que garantiza que una clase sólo tenga una instancia, y proporciona un punto de acceso global a ella. Este patrón tiene que ver con el proceso de creación de objetos, por tanto podemos decir que el patrón Singleton es un patrón de creación.

En ocasiones, en nuestras aplicaciones necesitamos que algunas clases tengan limitadas el número de instancias: conexión a base de datos, colas, etcétera. Aunque podríamos pensar en usar una variable global, esta propuesta no evita que se pueda limitar el número de instancias a la clase. Una solución válida es usar este patrón para limitar el número de objetos creados. Lo habitual es limitarlo a una sólo instancia, aunque se podría extender a una cantidad limitada por nosotros.


Veamos ahora un ejemplo de una clase que implementa un patrón Singleton.

 

 

package com.jmperezra.patterns.patterns;

/**
 * Class PSingleton
 *
 * Clase ejemplo que implementa un patrón singleton.
 *
 * @author jmperezramos.net
 */
public class PSingleton {

    //Variable que contendrá la única instancia de la clase.
    private static PSingleton pSingleton = new PSingleton();


    /**
     * Se declara el contructor privado para evitar que se instancien más objetos de la clase.
     */
    private PSingleton(){ }

    /**
     * Método estático que servirá para obtener la instancia de la clase.
     * Si no ha sido creada, se crea y se devuelve. Si ya ha sido creada, se devuelve.
     *
     * @return PSingleton
     */
    public static PSingleton getInstance(){
        if (pSingleton == null) 
            createInstance();
        return pSingleton;
    }


    /**
     * Método que crea la instancia del objeto. Sólo se accede al código sincronizado si la instancia
     * aún no ha sido creada.
     */
    private static void createInstance() {
        if (pSingleton == null) {
            synchronized(PSingleton.class) {
                if (pSingleton == null) {
                    pSingleton = new PSingleton();
                }
            }
        }
    }


    /**
     * Evitamos también que el objeto pueda ser clonado. Si se intenta, lanzamos una excepción.
     *
     * @return
     * @throws CloneNotSupportedException
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}

Este patrón también es considerado como un ‘anti-patrón’ debido a que  es muy difícil testear código con el uso de patrones Singleton ya que guarda siempre la misma referencia y durante los test no podremos cambiarla si lo necesitáramos, aunque siempre hay algún truco que ya veremos más adelante 😉

Pese a esto, siempre encontrará alguna utilidad en tu código donde requieras una única instancia o que el valor no cambie nunca en tu código, ahí, acuérdate de este patrón y olvídate de las variables estáticas 😉

 

Bibliografía: