English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Традиционная модель единичного экземпляра
Гарантирует, что класс имеет только один экземпляр и предоставляет глобальный доступ к нему.
Ядро идеи реализации единичного экземпляра
Это просто использование переменной для индикации того, была ли создана объект для класса, если да, то при следующем получении экземпляра этого класса, напрямую возвращается созданный ранее объект, дальше мыforcibly реализуем эту идею с помощью JavaScript, посмотрите на код:
var Singleton = function(name) { this.name = name; }; Singleton.prototype.getName = function() { alert(this.name); }; Singleton.getInstance = (function() { var instance = null; return function(name) { if (!instance) { instance = new Singleton(name); }; return instance; } )());
Мы получаем уникальный объект класса Singleton через Singleton.getInstance, это действительно правильно, но JavaScript сам по себе не имеет концепции класса, поэтому наше насильственное использование традиционного подхода к единичному экземпляру совершенно не имеет смысла, такой код также воняет и очень длинный (на самом деле мне не очень удобно это видеть嘻嘻嘻). Давайте используем закрытые функции JavaScript для реализации единичного экземпляра, посмотрите на код:
var CreateDiv = (function() { var instance; var CreateDiv = function(html) { if (instance) { return instance; } this.html = html; this.init(); return instance = this; }; CreateDiv.prototype.init = function() { var div = document.createElement('div'); div.innerHTML = this.html; document.body.appendChild( div ); }; return CreateDiv; })(); var a = new CreateDiv( 'sven1' ); var b = new CreateDiv( 'sven2' ); alert ( a === b ); // true
Можно увидеть, что таким образом мы действительно实现了 единичный пример с помощью closures, но этот код все еще очень сильно зависит. Конструктор CreateDiv на самом деле отвечает за две вещи. Первое - это создание объекта и выполнение метода инициализации init, второе - обеспечение того, что существует только один объект. Such code is not clear in terms of responsibility, now we need to separate these two tasks, the constructor is responsible for building the object, and the decision to return an existing object or create a new one and return it is delegated to another function, which is actually to satisfy a programming philosophy: the single responsibility principle. Such code can be better decoupled, please see the following code:
var CreateDiv = function (html) { this.html = html; this.init(); }; CreateDiv.prototype.init = function () { var div = document.createElement('div'); div.innerHTML = this.html; document.body.appendChild(div); }; var ProxySingletonCreateDiv = (function () { var instance; return function (html) { if (!instance) { instance = new CreateDiv(html); }; return instance; }; )()); var a = new ProxySingletonCreateDiv('sven1'); var b = new ProxySingletonCreateDiv('sven2'); alert(a === b); //true
Можно увидеть, что в настоящее время наш конструктор CreateDiv отвечает только за создание объектов, а за то, возвращать ли существующий объект или создавать новый и возвращать его, мы поручаем это代理-классу proxySingletonCreateDiv, такой код выглядит приятно (zhuang) удобно (bi)!
В конце предоставляем код высшей абстракции паттерна Singleton, суть ленивого Singleton!
//Абстракция паттерна Singleton, разделение функции создания объекта и проверки, был ли объект уже создан var getSingle = function (fn) { var result; return function () { return result || (result = fn.apply(this, arguments)); }; };
Функция fn是我们的 конструктор, мы можем передать любой需要的 конструктор, и мы можем создать новый ленивый Singleton. Например, передайте конструктор создания девушки и вызовите getSingle(), чтобы создать новую девушку. Если в будущем вызовите getSingle() еще раз, то он всегда вернет ту девушку, которую создали сначала. Что касается новой девушки - она не существует.
Обычные сценарии использования Singleton
Когда нужно создать уникальный объект, например, форма входа на страницу, которая может быть только одной, то можно использовать идею Singleton для ее реализации, конечно, можно и без него, но результат может быть таким, что каждый раз при отображении формы входа будет создана новая форма входа и отображена (затраты производительности), или不小心 будет отображена две формы входа.
Вот наши мысли о том, как реализовать паттерн Singleton в JavaScript, спасибо за поддержку呐喊教程。
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не был обработан вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), чтобы сообщить о нарушении, и предоставьте соответствующие доказательства. При подтверждении факта нарушения сайт незамедлительно удалят материалы,涉嫌侵权.