Ні. Коли кешування модулів Node не вдається, не вдається виконати одиночний шаблон. Я модифікував приклад, щоб він змістовно працював на 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
рядок вимоги на:
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();
Це означає, що я ніколи не стикався з ситуацією у виробничій системі, де мені потрібно було робити щось подібне. Я також ніколи не відчував необхідності використовувати однотонний візерунок у Javascript.