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.