Что такое паттерн проектирования Singleton?
Answer from AI
sobes.tech 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:
- Контроль над количеством экземпляров.
- Глобальная точка доступа.
- Ленивая инициализация (в некоторых реализациях).
Недостатки Singleton:
- Может нарушать принцип единственной ответственности.
- Затрудняет юнит-тестирование.
- Может привести к сильной связанности кода.