Sobes.tech
Junior

Cos'è il pattern Singleton?

sobes.tech AI

Risposta dell'AI

Il pattern Singleton garantisce che una classe abbia una sola istanza e fornisce un punto di accesso globale ad essa.

Viene utilizzato quando è richiesta un'unica istanza di una risorsa, ad esempio:

  • Gestore di configurazione
  • Pool di connessioni al database
  • Logger

Implementazioni:

  • Inizializzazione pigra (Lazy Initialization): L'istanza viene creata alla prima richiesta.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Costruttore privato
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObject)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Inizializzazione statica (Eager Initialization): L'istanza viene creata al caricamento della classe.

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

    Vantaggio: sicurezza thread di default, implementazione più semplice. Svantaggio: l'istanza viene creata anche se non viene utilizzata.

  • Utilizzo di Lazy<T>:.NET Framework fornisce supporto integrato per l'inizializzazione pigra.

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

    Vantaggio: sicurezza thread e inizializzazione pigra out-of-the-box, codice più pulito.

Vantaggi del Singleton:

  • Controllo sul numero di istanze.
  • Punto di accesso globale.
  • Inizializzazione pigra (in alcune implementazioni).

Svantaggi del Singleton:

  • Può violare il principio di responsabilità singola.
  • Rende difficile il testing unitario.
  • Può portare a una forte dipendenza dal codice.