Sobes.tech
Junior
103
questionbank

Что такое паттерн проектирования Singleton?

Ответ от нейросети

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:

  • Может нарушать принцип единственной ответственности.
  • Затрудняет юнит-тестирование.
  • Может привести к сильной связанности кода.