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:
- Може нарушити принцип једноставне одговорности.
- Затежу тестирање јединица.
- Може довести до јаке повезаности кода.