Junior
Mis on Singleton disainimuster?
sobes.tech AI
Vastus AI-lt
Singleton muster tagab, et klassil on ainult üks eksemplar ning pakub sellele globaalse juurdepääsu.
Kasutatakse, kui on vaja ainult ühte ressursi eksemplari, näiteks:
- Konfiguratsioonihaldur
- Andmebaasi ühenduste pook
- Logija
Teostused:
-
Hiliselt initsialiseerimine (Lazy Initialization): Eksemplar luuakse esimese kasutamise ajal.
public sealed class Singleton { private static Singleton? instance = null; private static readonly object lockObject = new object(); private Singleton() { } // Privaatne konstruktor public static Singleton Instance { get { // Null kontroll võimaldab vältida lukustamist enamikul juhtudel if (instance == null) { // Lukustamine mitme-kiiruse ohutuse jaoks lock (lockObject) { // Uuesti null kontroll lukustuse sees if (instance == null) { instance = new Singleton(); } } } return instance; } } } -
Statiline initsialiseerimine (Eager Initialization): Eksemplar luuakse klassi laadimisel:
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } // Privaatne konstruktor public static Singleton Instance { get { return instance; } } }Eelis: automaatne mitme-kiiruse ohutus, lihtsam teostus. Puudus: eksemplar luuakse isegi siis, kui seda ei kasutata.
-
`Lazy<T>`` kasutamine: .NET Framework pakub sisseehitatud toetust hilinenud initsialiseerimisele.
public sealed class Singleton { private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton()); private Singleton() { } // Privaatne konstruktor public static Singleton Instance { get { return lazyInstance.Value; } } }Eelis: mitme-kiiruse ohutus ja hilinenud initsialiseerimine otse karbist, puhas kood.
Singleton eelised:
- Kontroll eksemplaride arvu üle.
- Globaalse juurdepääsu punkt.
- Hilinenud initsialiseerimine (mõnedes teostustes).
Miinused:
- Võib rikkuda ainsuse vastutuse printsiipi.
- Raskendab üksuse testimist.
- Võib põhjustada tugevat koodi sidet.