Оригинальный адрес блога, добро пожаловать на обсуждение, звезда
Увидел, что кто-то использовал его случайноES6
изclass
Грамматика реализует лучший одноэлементный шаблон, поэтому я просто хочу объединить фактические примеры, с которыми я столкнулся, и некоторые обсуждения в Интернете, чтобы увидеть вjavascript
Как воспроизводится синглтон и как он применяется.
Паттерн Singleton в ES3/ES5
существуетES3/ES5
в, еще нетclass
С таким синтаксисом, когда я впервые столкнулся с шаблонами проектирования, общие онлайн-руководства были основаны наjava
Объяснить, потому что объектно-ориентированный язык, кажется, способен интуитивно объяснить эти шаблоны проектирования.
Например, одноэлементный режим гарантирует, что у класса есть только один экземпляр.Метод реализации обычно заключается в том, чтобы сначала определить, существует ли экземпляр или нет, и напрямую вернуться, если он существует.Если он не существует, он создается, а затем возвращается, что гарантирует, что класс имеет только один объект-экземпляр.
существуетjavascript
в да или нетДобрыйВсе эти вещи являются объектами, поэтому реализация синглтона в нем обычно использует вспомогательную функцию выполнения для возврата объекта, и у этого объекта есть способ получить его.instance
,
В момент приобретения оценивается, существует ли он. следующим образом:
var Single = (function(){
var instance;
/*
* 这里面还可以定义一些私有的方法,主要是用到了闭包
*/
function get() {
/*
* 这里返回的就是最后被使用到的对象
*/
return {
doSomething: function () {
console.log("AAA")
}
}
}
return {
getInstance () {
return instance || (instance = get()) // 如果instance 变量是有值的就直接返回,如果是没有值的就调用生成对象返回并赋值给instance
}
}
})()
var instance1 = Single.getInstance()
var instance2 = Single.getInstance()
console.log(instance1 === instance2) // true
существуетES3/ES5
Как правило, описанная выше организационная форма используется для реализации одноэлементного шаблона.ES6
сцена после.
После ES6 это реализовано с использованием синтаксического сахара класса.
ES6
представлятьclass
Ключевые слова, набор очень краткий для достиженияjs
Синтаксический сахар для конструкторов внутри. если правильноclass
Использование не очень знакомо, вы можете нажатьВведение учителя Руана в ES6Приходите и учитесь. Сначала посмотрите на код:
const single = 'single' // 这里使用symbol会好一点
class A {
static get instace () {
if (this[single]) { // 由于是静态函数,这里的this指的是A,并不是 new A() 产生的对象哦。
return this.single
}
return this[single] = new this() // 如果没有值就new 构造函数
}
constructor() {
const sourceClass = this.constructor // 获取构造函数对象
if (!sourceClass[single]) { // 判断对象上面是否已经有了单例
sourceClass[single] = this // 这里的this指的是已经构造好的对象,空对象,只是constructor指向A
}
return sourceClass[single] // 如果已经存在则直接返回
}
}
Вышеприведенный код все еще нуждается в немного глубжеES6
Это можно понять только со знанием «класса», в этом «классе» есть два метода для генерации экземпляров.
- Первый — это конструктор, который решит вернуть экземпляр.
- Во-вторых, есть статическое свойство, которое вернет экземпляр после суждения.
используется в
this
указать наA
Этот конструктор (конструктор тоже объект) я тоже прокомментировал в коде. Ключевым моментом является то, что в соответствии с указаннымkey
смонтировать этот экземпляр, но инкапсуляция немного лучше.
Используйте модульность nodejs для реализации одного примера
На самом деле здесьвыполнитьЭто не очень точно, я могу только сказать, что в настоящее времяnodejs
а такжеES6
Каждый модуль в модульности на самом деле является синглтоном. Давайте сначала посмотрим на код:
class A {
doSomething() { ... }
}
modules.export = new A() // 这里直接将对象生成,然后导出
потому чтоnodejs
а такжеES6
Каждый код кода будет снова загружен, второй или третий и т. Д., будет изcache
Найдите его внутри, если он был загружен, просто используйте его напрямую.
- Сначала мы создаем
a.js
, и выведите в нем предложение. - Открыть
node
, импортируйте этот файл. - Давайте проверим
module
Это видно, что модуль был сохранен вниз, то он вернется в соответствии с идентификатором (путь модуля) определяет, выполняется ли код модуля.
некоторые сценарии применения
- В интернете
loading
, вся веб-страница может создать только один экземпляр и отображать разные стили или поведение в соответствии с различными переданными параметрами, что является общим для всего мира. -
nodejs
Для экземпляра ссылки на базу данных внутри один раз получить доступ и создать ссылку очень ресурсоемко, поэтому это также глобальная операция запроса, которая единообразно использует один экземпляр.
Суммировать
Шаблон singleton по-прежнему очень прост и практичен. Это все еще практичноES6
Прокси для изменения создания объекта для достижения синглтона. Это просто методы реализации, нам нужно много думать об этих сценариях и этих шаблонах проектирования, чтобы добиться масштабируемости и возможности повторного использования кода.