Sobes.tech
Junior

¿Qué es el patrón de diseño Singleton?

sobes.tech AI

Respuesta de la IA

El patrón Singleton garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.

Se usa cuando se requiere una única instancia de un recurso, por ejemplo:

  • Gestor de configuración
  • Pool de conexiones a la base de datos
  • Registrador (logger)

Implementaciones:

  • Inicialización perezosa (Lazy Initialization): La instancia se crea en la primera llamada a ella.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Constructor privado
    
        public static Singleton Instance
        {
            get
            {
                // La comprobación de null evita bloqueos en la mayoría de los casos
                if (instance == null)
                {
                    // Bloqueo para seguridad en hilos
                    lock (lockObject)
                    {
                        // Comprobación doble en null dentro del bloqueo
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Inicialización estática (Eager Initialization): La instancia se crea al cargar la clase.

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Constructor privado
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Ventaja: seguridad en hilos por defecto, implementación más sencilla. Desventaja: la instancia se crea incluso si no se usa.

  • Usando Lazy<T>:.NET Framework ofrece soporte incorporado para inicialización perezosa.

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Constructor privado
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Ventaja: seguridad en hilos y inicialización perezosa lista para usar, código más limpio.

Ventajas del Singleton:

  • Control sobre el número de instancias.
  • Punto de acceso global.
  • Inicialización perezosa (en algunas implementaciones).

Desventajas del Singleton:

  • Puede violar el principio de responsabilidad única.
  • Dificulta las pruebas unitarias.
  • Puede conducir a una fuerte dependencia del código.