Sobes.tech
Junior

Czym jest wzorzec projektowy Singleton?

sobes.tech AI

Odpowiedź od AI

Wzorzec Singleton zapewnia, że klasa ma tylko jedną instancję i zapewnia do niej globalny punkt dostępu.

Używany jest, gdy wymagana jest pojedyncza instancja zasobu, na przykład:

  • Menedżer konfiguracji
  • Pula połączeń z bazą danych
  • Logger

Implementacje:

  • Leniwa inicjalizacja (Lazy Initialization): Instancja jest tworzona przy pierwszym odwołaniu.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Prywatny konstruktor
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObject)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Inicjalizacja statyczna (Eager Initialization): Instancja jest tworzona podczas ładowania klasy.

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

    Zaleta: domyślna bezpieczeństwo wątków, prostsza implementacja. Wada: instancja jest tworzona nawet, gdy nie jest używana.

  • Z użyciem Lazy<T>:.NET Framework zapewnia wbudowane wsparcie dla leniwej inicjalizacji.

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

    Zaleta: bezpieczeństwo wątków i leniwa inicjalizacja od razu, czystszy kod.

Zalety Singleton:

  • Kontrola nad liczbą instancji.
  • Globalny punkt dostępu.
  • Leniwa inicjalizacja (w niektórych implementacjach).

Wady Singleton:

  • Może naruszać zasadę pojedynczej odpowiedzialności.
  • Utrudnia testowanie jednostkowe.
  • Może prowadzić do silnego powiązania kodu.