რა არის 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-ის უპირატესობები:
- კონტროლი ინიციალების რაოდენობაზე
- გლობალური წვდომის წერტილი
- მერყევი ინიციალიზაცია (кейრეალიზაციებში)
ნაკლოვანებები:
- შეიძლება დაარღვიოს ერთგვარი პასუხისმგებლობის პრინციპი
- რთულდება ერთეულ ტესტირებას
- შეიძლება გამოიწვიოს კოდის ძლიერი დაკავშირება.