Порождающие шаблоны / Одиночка
- Синглтон (Singleton)
- Описание паттерна
- Реализация паттерна
- Примеры
- Использование
- Преимущества
- Недостатки
- Взаимодействие с другими паттернами
- Источники
Дает гарантию что в программе будет создан ТОЛЬКО ОДИН экземпляр класса (независимо от того, где происходит его вызов и попытка инициализации).
Другими словами, паттерн ограничивает инстанцирование класса.
Синглтон - это некоторое глобальное состояние системы. Он может стать причиной сильной связи между элементами.
Реализаций может быть несколько:
- глобальная переменная
- приватный конструктор класса
- шаблон Модуль
Для JavaScript особенно актуален последний вариант (создание замыкания).
Все реализации сводятся к скрытию конструктора класса и созданию некоторого статического метода доступа.
- Президент страны
- Корзина товаров на сайте интернет-магазина. Вы не можете допустить повторного создания корзины, так как при этом могут быть потеряны имеющиеся данные клиента.
- Всплывающее окно авторизации. Независимо из какого места вашего приложения и по какой причине вызывается попап авторизации, вы, вероятно, хотите, чтобы это было одно и то же окно, а не два разных.
- Доступ к базе данных, доступный всем клиентам программы.
- Если некоторый объект должен быть в программе в единственном экземпляре по каким-то причинам (хранит общие данные, сложно создается).
- Требуется больший контроль, чем при использовании глобальных переменных (Одиночку нельзя переопределить).
- Гарантирует наличие единственного экземпляра класса.
- Предоставляет к нему глобальную точку доступа.
- Реализует отложенную инициализацию объекта-одиночки.
- Позволяет хранить много данных в одном месте, не засоряя глобальное пространство имен.
- Нарушает принцип единственной ответственности класса (решает сразу две проблемы - гарантирует наличие единственного экземпляра и предоставляет глобальную точку доступа).
- Маскирует плохой дизайн.
- Проблемы мультипоточности.
- Требует постоянного создания Mock-объектов при юнит-тестировании.
- Частое применение (паттерны не связаны напрямую)
- Абстрактная фабрика (Abstract factory), Строитель (Builder), Прототип (Prototype), Фасад (Facade). Могут быть реализованы как
Одиночки
.
- Абстрактная фабрика (Abstract factory), Строитель (Builder), Прототип (Prototype), Фасад (Facade). Могут быть реализованы как