Sobes.tech
Junior

Ի՞նչ է Singleton դիզայնի նմուշը։

sobes.tech AI

Պատասխան AI-ից

Singleton նմուշը երաշխավորում է, որ դասի միայն մեկ օրինակ կա և տրամադրում է գլոբալ մուտք դեպի այն:

Օգտագործվում է, երբ անհրաժեշտ է միայն մեկ ռեսուրսի օրինակ, օրինակ՝

  • Կոնֆիգուրացիայի մենեջեր
  • Բազայի տվյալների կապերի պուլ
  • Լոգգեր

Իմպլեմենտացիաներ՝

  • Կենդանի ինիցիալիզացիա (Lazy Initialization): Օրինակը ստեղծվում է առաջին մուտքի ժամանակ:

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Անձնական կոնստրուկտոր
    
        public static Singleton Instance
        {
            get
            {
                // null ստուգումը թույլ է տալիս խուսափել սինխրոնիզացիայից մեծ մասում դեպքերի
                if (instance == null)
                {
                    // Լոկալիզացիա՝ բազմակողմանի անվտանգություն
                    lock (lockObject)
                    {
                        // Նորից ստուգում null-ի համար
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Կայուն ինիցիալիզացիա (Eager Initialization): Օրինակը ստեղծվում է դասի բեռնումիս:

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Անձնական կոնստրուկտոր
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Առավելություն՝ ինքնաբերաբար անվտանգ բազմակողմանի, ավելի պարզ իրականացում:

    Недостаток՝ օրինակն ստեղծվում է, նույնիսկ եթե այն չի օգտագործվում:

  • Lazy<T>-ի օգտագործմամբ: .NET Framework-ը ներառում է բովանդակային աջակցություն՝ մերժված ինիցիալիզացիայի համար:

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Անձնական կոնստրուկտոր
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Առավելություն՝ բազմակողմանի անվտանգություն և մերժված ինիցիալիզացիա՝ տուփից դուրս, ավելի մաքուր կոդ:

Առավելություններ՝

  • Կառավարում է օրինակների քանակը
  • Գլոբալ մուտք
  • Մերժված ինիցիալիզացիա

Նորություններ՝

  • Կարող է խախտել միակ պատասխանատվության սկզբունքը
  • Կրկնվող թեստավորման դժվարություն
  • Կարող է հանգեցնել կոդի խիստ կապվածության