Sobes.tech
Junior

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ę.