Skip to content

Latest commit

 

History

History

singleton

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Порождающие шаблоны / Одиночка

Одиночка

Другие названия

  • Синглтон (Singleton)

Содержание

Описание паттерна

Дает гарантию что в программе будет создан ТОЛЬКО ОДИН экземпляр класса (независимо от того, где происходит его вызов и попытка инициализации).

Другими словами, паттерн ограничивает инстанцирование класса.

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

Реализация паттерна

Схема паттерна Одиночка

Реализаций может быть несколько:

  • глобальная переменная
  • приватный конструктор класса
  • шаблон Модуль

Для JavaScript особенно актуален последний вариант (создание замыкания).

Все реализации сводятся к скрытию конструктора класса и созданию некоторого статического метода доступа.

Примеры

  • Президент страны
  • Корзина товаров на сайте интернет-магазина. Вы не можете допустить повторного создания корзины, так как при этом могут быть потеряны имеющиеся данные клиента.
  • Всплывающее окно авторизации. Независимо из какого места вашего приложения и по какой причине вызывается попап авторизации, вы, вероятно, хотите, чтобы это было одно и то же окно, а не два разных.
  • Доступ к базе данных, доступный всем клиентам программы.

Использование

  • Если некоторый объект должен быть в программе в единственном экземпляре по каким-то причинам (хранит общие данные, сложно создается).
  • Требуется больший контроль, чем при использовании глобальных переменных (Одиночку нельзя переопределить).

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

  • Гарантирует наличие единственного экземпляра класса.
  • Предоставляет к нему глобальную точку доступа.
  • Реализует отложенную инициализацию объекта-одиночки.
  • Позволяет хранить много данных в одном месте, не засоряя глобальное пространство имен.

Недостатки

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

Взаимодействие с другими паттернами

Источники