Нет. Когда кэширование модуля узла не удается, этот одноэлементный шаблон не работает. Я изменил пример, чтобы он работал в OSX:
var sg = require("./singleton.js");
var sg2 = require("./singleton.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Это дает результат, которого ожидал автор:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Но небольшая модификация отменяет кеширование. В OSX сделайте следующее:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Или в Linux:
% ln singleton.js singleton2.js
Затем измените sg2
строку require на:
var sg2 = require("./singleton2.js");
И бац , синглтон побежден:
{ '1': 'test' } { '2': 'test2' }
Я не знаю приемлемого способа обойти это. Если вы действительно чувствуете необходимость сделать что-то одноэлементное и не против загрязнять глобальное пространство имен (и многие проблемы, которые могут возникнуть), вы можете изменить строки автора getInstance()
и exports
на:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Тем не менее, я никогда не сталкивался с ситуацией в производственной системе, когда мне нужно было бы сделать что-то подобное. Я также никогда не чувствовал необходимости использовать шаблон singleton в Javascript.