Реализация Singleton
Одиночка (англ. Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
Если открыть wiki, то можно увидеть 5 примеров реализации, нормальный из них только один :]
function Singleton() { #!+ if (!Singleton.__instance) { #! Singleton.__instance = this; } else { #! return Singleton.__instance; #!- } #! // Код конструктора } console.log(new Singleton === new Singleton); // true
Это классический способ, но в нем слишком много завязок на имя класса. Так что доведем его до логического конца и отвяжись от имени.
function Singleton() { var self = this.constructor; // ссылка на Singleton #!+ if (!self.__instance) { #! self.__instance = this; } else { #! return self.__instance; #!- } #! // Код конструктора }
console.log(new Singleton()); // [object Singleton] #! console.log(Singleton()); // undefined
function Singleton() { #!+ "use strict" #!- // остальной код } #!+ console.log(Singleton()); #!- // TypeError: Cannot read property 'constructor' of undefined
function Singleton() { "use strict" #!+ if (!(this instanceof Singleton)) { #! return new Singleton; #!- } else ... } #! console.log(Singleton()); // [object Singleton] #! console.log(Singleton() === new Singleton()); // true
Как видите, мы решили проблемы, но опять пришлось завязаться на название функции.
function Singleton() { #! return Singleton.prototype.init(); } #!+ Singleton.prototype.init = function () { #! // код конструктора #! this.init = function () { return this; }; #! return this; #!- } #! console.log(Singleton() === new Singleton()); // true
Просто и красиво, но:
var foo = Singleton(); var bar = new Singleton(); #! console.log(foo instanceof Singleton); // false :[ #! console.log(bar instanceof Singleton); // false :[
function Singleton() { return Singleton.prototype.init(); } Singleton.prototype.init = function () { // код конструктора #! var _this = Object.create(this); #!+ _this.init = function () { return this; }; #!- return _this; } #!+ var foo = Singleton(); #!- var bar = new Singleton(); #! console.log(foo === bar); // true #! console.log(foo instanceof Singleton); // Bingo! #! console.log(bar instanceof Singleton); // Combo!
Знаете ещё варинаты, присылайте мне на trash@rubaxa.org