Sobes.tech
Junior

Mi az a Singleton tervezési minta?

sobes.tech MI

Válasz az MI-től

A Singleton minta biztosítja, hogy egy osztálynak csak egy példánya legyen, és globális hozzáférési pontot biztosít hozzá.

Olyankor használják, amikor egy erőforrásból csak egy példány szükséges, például:

  • Konfigurációkezelő
  • Adatbázis-kapcsolat pool
  • Naplózó (logger)

Implementációk:

  • Lusta inicializálás (Lazy Initialization): A példány az első hozzáféréskor jön létre.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Privát konstruktor
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObject)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Statikus inicializálás (Eager Initialization): A példány a osztály betöltésekor jön létre.

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Privát konstruktor
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Előny: alapértelmezett szálbiztonság, egyszerűbb megvalósítás. Hátrány: a példány akkor is létrejön, ha nem használják.

  • Lazy<T> használatával:.NET Framework beépített támogatást nyújt a lusta inicializáláshoz.

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Privát konstruktor
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Előny: szálbiztonság és lusta inicializálás készen, tisztább kód.

A Singleton előnyei:

  • Az példányok számának kontrollja.
  • Globális hozzáférési pont.
  • Lusta inicializálás (egyes megvalósításokban).

A Singleton hátrányai:

  • Megtarthatja az egyedi felelősség elvét.
  • Nehezíti az egységtesztelést.
  • Erős kötődést okozhat a kódhoz.