Sobes.tech
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.