Шаблон Singleton: ограничить количество экземпляров класса только один раз, класс имеет только один экземпляр и предоставить глобальную точку доступа для доступа к нему.

Паттерн Singleton — это тип творческого паттерна проектирования. Для сценариев, где глобально требуется только один объект, например пул потоков, глобальный кеш, объект окна и т. д.

Функции

  1. класс имеет только один экземпляр
  2. Экземпляр доступен глобально
  3. Самосоздание (активное создание экземпляров)
  4. Отложенная инициализация, т.е. отложенное выполнение (отличие от статических классов/объектов)

JavaScript — это неформальный объектно-ориентированный язык без определений классов. Для одноэлементного шаблона требуется «уникальный» и «глобально доступный» объект, аналогичный глобальному объекту в JavaScript, только для того, чтобы соответствовать двум характеристикам одноэлементного шаблона: «уникальный» и «глобально доступный». Хотя это не формальный одноэлементный шаблон, нельзя отрицать, что он обладает характеристиками одноэлементного шаблона.

// глобальный объект

var globaObj = {};

Использование глобальных переменных имеет следующие проблемы:

  1. Загрязнение пространства имен (конфликт имен переменных)
  2. Неудобно контролировать во время обслуживания (легко случайно накрыть)

Решение проблемы компрометации глобальной переменной:

  1. использовать пространство имен
  2. Замыкания инкапсулируют закрытые переменные (используя область действия функции)
  3. ES6 const/symbol

Хотя глобальные переменные могут реализовывать синглтоны, из-за их собственных проблем не рекомендуется использовать их в качестве шаблона синглтона в реальных проектах, особенно в приложениях средних и крупных проектов. Обслуживание глобальных переменных следует рассматривать как затраты.

Достигать

Используйте переменную для хранения объекта экземпляра класса (первоначально значение равно null/undefined ). Когда создается экземпляр класса, оценивается, существует ли объект экземпляра класса, и экземпляр возвращается, если он существует. Если он не существует, экземпляр класса создается и возвращается. Многократный вызов метода создания экземпляра класса возвращает один и тот же объект экземпляра.

«Простая версия» одноэлементного паттерна:

Код определяет функцию Singleton , которая является «гражданином первого класса» в JavaScript и может определять для нее методы свойств. Следовательно, мы можем определить метод getInstance() в функции Singleton для управления синглтоном и создания объекта экземпляра возвращаемого класса вместо создания объекта экземпляра класса с помощью традиционного оператора new.

this.instance сохраняет созданный экземпляр объекта. Каждый раз, когда получен созданный объект-экземпляр, оценивается, есть ли в this.instance объект-экземпляр, и он возвращается. В конце концов, будет возвращен только один и тот же объект экземпляра класса Singleton.

Существующие проблемы:

  1. Недостаточно «прозрачно» использовать new для создания экземпляра класса, поэтому необходимо ограничить вызывающий метод создания экземпляра класса: Singleton.getInstance(…)
  2. Операция управления синглтоном совмещена с операцией создания объекта и функционального кода, что не соответствует «принципу единой ответственности»

«Прозрачный» одноэлементный шаблон:

Реализуйте «прозрачную версию» одноэлементного шаблона с целью решения: используйте новый оператор единообразно, чтобы получить одноэлементный объект вместо Singleton.getInstance(…)

Одноэлементный паттерн «прозрачная версия» решает проблему недостаточной «прозрачности», и мы можем использовать new operator для создания объектов-экземпляров.

Одноэлементный паттерн «прокси-версия»

С помощью формы «прокси» цель состоит в том, чтобы решить: отделить одноэлементную операцию управления от операции создания объекта для достижения меньшей детализации разделения в соответствии с «принципом единой ответственности».

Ленивый одноэлементный шаблон

Ленивый синглтон, предназначенный для решения: создавать объекты экземпляра класса только при необходимости. Фронтенд-разработчикам не привыкать к ленивой оптимизации производительности загрузки. Ленивые синглтоны также решают проблему «загрузки по требованию».

Требование: Всплывающее окно страницы запрашивает, несколько вызовов, есть только один объект всплывающего окна, но отображаемое информационное содержание отличается.

Чтобы разработать такой глобальный всплывающий объект, мы можем применить шаблон singleton. Чтобы повысить его производительность, мы можем заставить его генерировать экземпляры и создавать узлы DOM, когда нам нужно их вызывать.

Демонстрация в коде — это общий метод создания «ленивого синглтона». Если вам также нужно поле входа createLoginLayer, поле createFrame Frame, вы можете вызвать getSingleton(…) method для создания соответствующего объекта экземпляра.

Применимая сцена

Характеристики одноэлементного шаблона, предназначенного для решения: поддерживать глобальный экземпляр объекта.

  1. Ссылки на сторонние библиотеки (в нескольких ссылках будет использоваться только одна ссылка на библиотеку, например jQuery)
  2. Всплывающее окно (окно входа в систему, окно информационного продвижения)
  3. корзина (одна корзина на пользователя)
  4. Хранилище управления глобальным состоянием (Vuex/Redux)

Когда в проект внедряется сторонняя библиотека, когда файл библиотеки загружается многократно, глобально будет инстанцирован только один объект библиотеки, такой как jQuery, lodash, moment… По сути, их концепция реализации тоже своего рода singleton mode приложение:

Преимущества и недостатки

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

Недостатки: не подходит для динамически расширяющихся объектов или сценариев, в которых необходимо создать несколько похожих объектов.

СОВЕТЫ: ​​В многопоточных языках программирования одноэлементный режим связан с проблемой блокировок синхронизации. Поскольку JavaScript является однопоточным языком программирования, на эту проблему можно пока не обращать внимания.