Паттерн Singleton в JS (ES5/ES6/Nodejs)

Шаблоны проектирования

Оригинальный адрес блога, добро пожаловать на обсуждение, звезда

Увидел, что кто-то использовал его случайно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, и выведите в нем предложение.
    a.js
  • Открытьnode, импортируйте этот файл.
    require
  • Давайте проверимmodule
    module
    Это видно, что модуль был сохранен вниз, то он вернется в соответствии с идентификатором (путь модуля) определяет, выполняется ли код модуля.

некоторые сценарии применения

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

Суммировать

Шаблон singleton по-прежнему очень прост и практичен. Это все еще практичноES6Прокси для изменения создания объекта для достижения синглтона. Это просто методы реализации, нам нужно много думать об этих сценариях и этих шаблонах проектирования, чтобы добиться масштабируемости и возможности повторного использования кода.