Não. Quando o cache do módulo do Node falha, esse padrão singleton falha. Modifiquei o exemplo para executar significativamente no 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());
Isso dá a saída que o autor antecipou:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Mas uma pequena modificação anula o cache. No OSX, faça o seguinte:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Ou, no Linux:
% ln singleton.js singleton2.js
Em seguida, altere a sg2
linha necessária para:
var sg2 = require("./singleton2.js");
E bam , o singleton é derrotado:
{ '1': 'test' } { '2': 'test2' }
Não sei de uma maneira aceitável de contornar isso. Se você realmente sente a necessidade de fazer algo parecido com um singleton e não tem problema em poluir o namespace global (e os muitos problemas que podem resultar), você pode alterar o autor getInstance()
e as exports
linhas para:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Dito isso, nunca me deparei com uma situação em um sistema de produção em que precisasse fazer algo assim. Também nunca senti a necessidade de usar o padrão singleton em Javascript.