Назад к вопросам
Junior
233
questionbank

Что такое паттерн Singleton?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Паттерн Singleton — это порождающий паттерн проектирования, который гарантирует существование только одного экземпляра класса и предоставляет глобальную точку доступа к нему.

Используется, когда требуется ровно один экземпляр класса, например, для мене­джера конфи­гура­ции, пула подклю­чений к базе данных или логгера.

Реализация:

  • Приватный статический член класса для хранения единственного экземпляра.
  • Приватный конструктор, запрещающий создание экземпляров извне.
  • Статический публичный метод для получения экземпляра, который создает его при первом вызове (ленивая инициализация) или возвращает уже созданный.

Пример:

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object lockObject = new object();

    private Singleton()
    {
        // Приватный конструктор
    }

    public static Singleton Instance
    {
        get
        {
            // Ленивая инициализация с потокобезопасностью
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null) // Двойная проверка для производительности
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    public void DoSomething()
    {
        // Метод класса Singleton
        Console.WriteLine("Singleton method called.");
    }
}

Преимущества:

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

Недостатки:

  • Может быть антипаттерном, если используется без веской причины.
  • Усложняет модульное тестирование из-за глобального состояния.
  • Нарушает принцип единой ответственности (управляет своим жизненным циклом).
  • Проблемы с многопоточностью, если не реализована потокобезопасность.