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;
            }
        }
    }
    

    უპირატესობა: მრავალსხივიანი უსაფრთხოება და მერყევი ინიციალიზაცია პირდაპირ ყუთიდან, სუფთა კოდი.

Singleton-ის უპირატესობები:

  • კონტროლი ინიციალების რაოდენობაზე
  • გლობალური წვდომის წერტილი
  • მერყევი ინიციალიზაცია (кейრეალიზაციებში)

ნაკლოვანებები:

  • შეიძლება დაარღვიოს ერთგვარი პასუხისმგებლობის პრინციპი
  • რთულდება ერთეულ ტესტირებას
  • შეიძლება გამოიწვიოს კოდის ძლიერი დაკავშირება.