Перейти к основному содержимому

Что это такое

Паттерн Одиночка (Singleton) гарантирует, что у класса есть ровно один экземпляр во всей программе, и даёт всем одну и ту же точку доступа к нему. Типичные одиночки: конфигурация, пул соединений, логгер.

В Python здесь есть преимущество: модуль импортируется только один раз, поэтому объект, созданный на уровне модуля, уже является общим единственным экземпляром. Когда создание должно быть ленивым — выполняться при первом использовании, а не при импорте, — его защищает метод класса, например Config.instance(): он создаёт объект при первом вызове и затем всегда возвращает сохранённый экземпляр.


Пример: одна конфигурация для всех

Конфигурация загружается при первом вызове Config.instance() и больше никогда. Каждый вызывающий код получает один и тот же объект.

Однократная загрузка с защищённым методом класса

Строка «загрузка конфигурации» выводится только один раз, хотя Config.instance() вызывается дважды, — а a is b доказывает, что оба вызова получили один и тот же экземпляр.

Prompt
Напишите программу на Python с одиночкой Config: метод класса instance() загружает конфигурацию ровно один раз и выводит строку во время загрузки. Вызовите instance() дважды, выведите имя приложения и докажите, что оба вызова возвращают один и тот же объект, сравнив их с помощью is.
Вывод: полная программа на Python

Когда использовать

Используйте его, когда чего-то действительно должно быть ровно одно: одна загруженная конфигурация, один пул соединений, один кеш — и создание обходится дорого, или дубликаты будут конфликтовать.

Обойдитесь без него, когда можно просто создать значение один раз в начале программы и передать его тем, кому оно нужно. Явная передача зависимостей понятнее глобального доступа — одиночка является последним средством, а не первым.


Плюсы и минусы

Плюсы: гарантированно единственный экземпляр; ленивое создание при первом использовании; система модулей даёт простой случай почти бесплатно.

Минусы: это замаскированная глобальная переменная — скрытые зависимости усложняют понимание кода; в тестах его нелегко заменить подделкой; злоупотребление приводит к запутанным программам.