Sobes.tech
Junior

Šta je Singleton obrazac dizajna?

sobes.tech АИ

Одговор од АИ

Шаблон 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:

  • Контрола над бројем екземпляра.
  • Глобална тачка приступа.
  • Ленива инициализација (у неким реализацијама).

Недостаци Singleton:

  • Може нарушити принцип једноставне одговорности.
  • Затежу тестирање јединица.
  • Може довести до јаке повезаности кода.