Ответ
Singleton (Одиночка) — это порождающий паттерн проектирования, который гарантирует, что у класса будет только один экземпляр, и предоставляет к нему глобальную точку доступа.
Основная цель — контролировать создание объектов, ограничивая их количество одним экземпляром. Это полезно для ресурсов, которые по своей природе должны быть уникальными, например, пул соединений с базой данных, логгер или конфигурация приложения.
Ключевые элементы реализации:
- Приватный конструктор: Запрещает прямое создание экземпляров класса с помощью оператора
new
(или его аналога). - Статическая переменная: Хранит единственный экземпляр класса.
- Статический публичный метод: Возвращает этот экземпляр. При первом вызове он создает объект, при последующих — возвращает уже существующий.
Пример на Python (потокобезопасный):
import threading
class Singleton:
_instance = None
_lock = threading.Lock()
def __new__(cls):
# Используем блокировку для обеспечения потокобезопасности
# при создании экземпляра в многопоточной среде.
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
# Проверка
s1 = Singleton()
s2 = Singleton()
print(f"s1 is s2: {s1 is s2}") # Вывод: s1 is s2: True
Преимущества:
- Гарантирует наличие единственного экземпляра.
- Предоставляет глобальную точку доступа.
Недостатки:
- Нарушает принцип единственной ответственности (SRP): Класс начинает отвечать не только за свою основную логику, но и за контроль количества экземпляров.
- Маскирует плохой дизайн: Глобальное состояние затрудняет тестирование и понимание зависимостей между компонентами.
- Проблемы в многопоточной среде: Требует дополнительной синхронизации для обеспечения потокобезопасности.