Patrón de diseño Singleton

Archivada en Desarrollo

Patrón de diseño Singleton

Serie “design patterns”

Este es el artículo número 2 de la serie “design patterns”:

  1. Patrones de diseño
  2. Patrón de diseño Singleton

|Recordemos que los patrones de diseño describen un problema que puede ocurrir una y otra vez en nuestro entorno. También describen el núcleo de la solución a ese problema de una forma que puede usarse múltiples. Es decir, buscan solucionar un problema en un contexto específico.

En general, estos artículos sobre patrones de diseño se componen de cinco elementos: el nombre de patrón de diseño, el problema, la solución, las ventajas de usar este patrón y, por último, ejemplos de estos patrones en en diferentes lenguajes de programación.

En esta ocasión veremos el patrón de diseño de creación llamado Singleton.

Singleton

El patrón de diseño Singleton se utiliza para garantizar que una clase tenga solo una instancia y que se pueda acceder a ella globalmente. Este patrón es útil cuando solo se necesita una instancia de una clase en todo el sistema, como por ejemplo una base de datos.

El patrón Singleton se implementa utilizando una clase con un constructor privado que solo puede ser llamado internamente. La clase también debe tener una variable estática privada que almacena la única instancia de la clase. Se proporciona un método estático público para acceder a esta instancia.

Ventajas

Como consecuencia del uso del patrón Singleton tenemos los siguientes beneficios:

  1. Espacio de nombres reducido El patrón Singleton es una mejora de las variables globales. Evita la contaminación del espacio de nombres con variables globales.
  2. Refinamiento de representación y operación Es poosible obtener subclases de una clase Singleton, y es fácil configurar una aplicación de una clase con su clase extendida.
  3. Acceso controlado a una sola instancia Como este patrón de diseño encapsula una sola instancia, se puede tener un control estricto sobre cómo y cuando el cliente tiene acceso a ésta.
  4. Permite un número variable de instancias Este patrón de diseño nos permite cambiar de opinión de manera simple y permitir más de una instancia de la clase Singleton. Incluso podemos controlar el número de instancias que puede usar la aplicación.

Ejemplos

Java

Veamos un ejemplo de implementación del patrón de diseño Singleton en Java:

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

En este ejemplo, la clase Singleton tiene un constructor privado y una variable estática privada instance que es la única instancia de la clase. El método estático público getInstance verifica si la instancia ya ha sido creada y la devuelve si ya existe o la crea si no.

Python

En Python, la implementación del patrón Singleton se puede hacer de la siguiente manera:

class Singleton:
    __instance = None

    def __init__(self):
        if Singleton.__instance != None:
            raise Exception("Ya existe una instancia de Singleton.")
        else:
            Singleton.__instance = self

    @staticmethod
    def getInstance():
        if Singleton.__instance == None:
            Singleton()
        return Singleton.__instance

En este ejemplo, la clase Singleton tiene un constructor que verifica si ya existe una instancia de la clase y lanza una excepción si ya existe. El método estático getInstance devuelve la instancia única de la clase.

Go

En Go, que no tiene clases u objetos, el patrón Singleton se puede implementar usando estructuras.

package singleton

import "sync"

var instance *Singleton
var once sync.Once

type Singleton struct {
    value int
}

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{value: 0}
    })
    return instance
}

En este ejemplo, la variable instance es una instancia única de la estructura Singleton que se crea utilizando la función once.Do de la biblioteca sync para asegurarse de que solo se cree una vez.

C#

En C#, la implementación del patrón Singleton se puede hacer de la siguiente manera:

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton() {}
}

En este ejemplo, la clase Singleton utiliza la clase Lazy de C# para garantizar que solo se cree una instancia de la clase. El método Instance devuelve la única instancia de la clase.

En resumen, el patrón de diseño Singleton se utiliza para garantizar que solo se cree una instancia de una clase y que se pueda acceder a ella globalmente. Esta solución es útil cuando solo se necesita una instancia de una clase en todo el sistema. La implementación del patrón Singleton varía en diferentes lenguajes de programación, pero la idea básica es la misma.

Revisa el artículo Qué son los patrones de diseño para conocer otros los diferentes tipos de patrones de diseño.

Javier Sanchez Toledano

Soy programador en Django+Python y WordPress. Auditor líder certificado en la norma ISO 9001:2008. Fotógrafo aficionado.
Redes Sociales:

Tlaxcala, México

Comentarios