Sobes.tech
Junior

Co je to vzor návrhu Singleton?

sobes.tech AI

Odpověď od AI

Vzor Singleton zaručuje, že třída má pouze jeden instance a poskytuje globální přístup k němu.

Používá se, když je potřeba jediný instance zdroje, například:

  • Správce konfigurace
  • Pool připojení k databázi
  • Logovací systém

Implementace:

  • Líná inicializace (Lazy Initialization): Instance je vytvořena při prvním přístupu k ní.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Soukromý konstruktor
    
        public static Singleton Instance
        {
            get
            {
                // Kontrola na null umožňuje vyhnout se zámku ve většině případů
                if (instance == null)
                {
                    // Zámek pro bezpečnost vlákna
                    lock (lockObject)
                    {
                        // Opětovná kontrola na null uvnitř zámku
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Statická inicializace (Eager Initialization): Instance je vytvořena při načtení třídy.

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

    Výhoda: výchozí bezpečnost vlákna, jednodušší implementace. Nevýhoda: instance je vytvořena, i když není použita.

  • Pomocí Lazy<T>: .NET Framework poskytuje vestavěnou podporu líné inicializace.

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

    Výhoda: bezpečnost vlákna a líná inicializace přímo z krabice, čistší kód.

Výhody Singletonu:

  • Kontrola nad počtem instancí.
  • Globální přístupový bod.
  • Líná inicializace (v některých implementacích).

Nevýhody Singletonu:

  • Může narušovat princip jediné odpovědnosti.
  • Ztěžuje jednotkové testování.
  • Může vést k silné vazbě kódu.