Kas yra Singleton dizaino šablonas?
sobes.tech AI
Atsakymas iš AI
Singleton šablonas užtikrina, kad klasėje yra tik vienas egzempliorius ir suteikia jam globalų prieigą.
Naudojama, kai reikalingas vienintelis išteklių egzempliorius, pavyzdžiui:
- Konfigūracijos tvarkyklė
- Prisijungimų prie duomenų bazės baseinas
- Žurnalo rašytojas
Įgyvendinimai:
-
Vėlyva inicializacija (Lazy Initialization): Egzempliorius sukuriamas pirmojo kreipimosi metu.
public sealed class Singleton { private static Singleton? instance = null; private static readonly object lockObject = new object(); private Singleton() { } // Privatus konstruktorius public static Singleton Instance { get { // null patikra leidžia išvengti užrakinimo daugeliu atvejų if (instance == null) { // Užrakinimas siekiant saugumo keliuose srautuose lock (lockObject) { // Pakartotinė patikra užrakinimo viduje if (instance == null) { instance = new Singleton(); } } } return instance; } } } -
Statinė inicializacija (Eager Initialization): Egzempliorius sukuriamas klasės įkėlimo metu:
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } // Privatus konstruktorius public static Singleton Instance { get { return instance; } } }Pranašumas: automatinė saugumas keliuose srautuose, paprasta įgyvendinimas. Trūkumas: egzempliorius sukuriamas net jei jis nenaudojamas.
-
Naudojant
Lazy<T>: .NET Framework siūlo integruotą palaikymą vėlyvai inicializacijai.public sealed class Singleton { private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton()); private Singleton() { } // Privatus konstruktorius public static Singleton Instance { get { return lazyInstance.Value; } } }Pranašumas: kelių srautų saugumas ir vėlyva inicializacija tiesiai iš dėžutės, švaresnis kodas.
Singleton privalumai:
- Kontroliuoja egzempliorių skaičių.
- Globalus prieigos taškas.
- Vėlyva inicializacija (kai kuriose įgyvendinimuose).
Trūkumai:
- Gali pažeisti vienos atsakomybės principą.
- Sunkina vienetinius testus.
- Gali sukelti stiprią kodo priklausomybę.