Saltar al contenido principal

Singleton

CreationalGang of FourAlrededor de 1 min

Propósito

Asegurar que una clase solo tenga una instancia y proporcionar un punto de acceso global a ella.

Explicación

Ejemplo del mundo real

Solo puede haber una torre de marfil donde los magos estudian su magia. La misma torre de marfil encantada
siempre es utilizada por los magos. La torre de marfil aquí es un singleton.

En otras palabras

Asegura que solo se cree un objeto de una clase en particular.

Wikipedia dice

En ingeniería de software, el patrón singleton es un patrón de diseño de software que limita la
instanciación de una clase a un solo objeto. Esto es útil cuando se necesita exactamente un objeto para
coordinar acciones en todo el sistema.

Ejemplo programático

Joshua Bloch, Effective Java 2nd Edition p.18

Un enum type con un solo elemento es la mejor forma de implementar un singleton

public enum EnumIvoryTower {
  INSTANCE
}

Luego,

    var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
    var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
    LOGGER.info("enumIvoryTower1={}", enumIvoryTower1);
    LOGGER.info("enumIvoryTower2={}", enumIvoryTower2);

La salida de la consola

enumIvoryTower1=com.iluwatar.singleton.EnumIvoryTower@1221555852
enumIvoryTower2=com.iluwatar.singleton.EnumIvoryTower@1221555852

Diagrama de clases

alt text
Singleton pattern class diagram

Aplicabilidad

Utilice el patrón Singleton cuando:

  • Debe haber exactamente una instancia de una clase, y debe ser accesible para los clientes desde un punto de acceso conocido
  • Cuando la única instancia debe ser extensible mediante herencia, y los clientes deben poder usar una instancia extendida sin modificar su código

Algunos casos típicos para Singleton:

  • La clase logging
  • Gestionar una conexión a una base de datos
  • Gestor de archivos

Usos conocidos

Consecuencias

  • Viola el Principio de Responsabilidad Única (Single Responsibility Principle - SRP) al controlar su creación y ciclo de vida.
  • Fomenta el uso de una instancia compartida globalmente, lo que impide que un objeto y los recursos utilizados por este objeto se liberen.
  • Crea un código fuertemente acoplado. Los clientes del Singleton se vuelven difíciles de probar.
  • Hace casi imposible hacer subclases de un Singleton.

Créditos