Sobes.tech
Junior

Čo je to návrhový vzor Singleton?

sobes.tech AI

Odpoveď od AI

Vzorok Singleton zabezpečuje, že trieda má iba jeden inštanciu a poskytuje globálny prístup k nemu.

Používa sa, keď je potrebný jediný inštancia zdroja, napríklad:

  • Správca konfigurácie
  • Pool pripojení k databáze
  • Loggér

Implementácie:

  • Lazivá inicializácia (Lazy Initialization): Inštancia sa vytvára pri prvom prístupe.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Súkromný konštruktor
    
        public static Singleton Instance
        {
            get
            {
                // Kontrola na null umožňuje vyhnúť sa zámku vo väčšine prípadov
                if (instance == null)
                {
                    // Zámok pre bezpečnosť vlákna
                    lock (lockObject)
                    {
                        // Opätovná kontrola na null vo vnútri zámku
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Statická inicializácia (Eager Initialization): Inštancia sa vytvára pri načítaní triedy.

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Súkromný konštruktor
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Výhoda: predvolená bezpečnosť vlákna, jednoduchšia implementácia. Nevýhoda: inštancia je vytvorená, aj keď sa nepoužíva.

  • Pomocou Lazy<T>: .NET Framework poskytuje vstavanú podporu pre lazy inicializáciu.

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Súkromný konštruktor
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Výhoda: bezpečnosť vlákna a lazy inicializácia priamo z krabice, čistejší kód.

Výhody Singleton:

  • Kontrola nad počtom inštancií.
  • Globálny prístupový bod.
  • Lazy inicializácia (v niektorých realizáciách).

Nevýhody Singleton:

  • Môže narušiť princíp jednotnej zodpovednosti.
  • Zťažuje jednotkové testovanie.
  • Môže viesť k silnej väzbe kódu.