No. Cuando falla el almacenamiento en caché del módulo de Node, ese patrón singleton falla. Modifiqué el ejemplo para que se ejecute de manera significativa en 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());
Esto da el resultado que el autor anticipó:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Pero una pequeña modificación derrota al almacenamiento en caché. En OSX, haz esto:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
O, en Linux:
% ln singleton.js singleton2.js
Luego cambie la sg2
línea requerida a:
var sg2 = require("./singleton2.js");
Y bam , el singleton es derrotado:
{ '1': 'test' } { '2': 'test2' }
No conozco una forma aceptable de solucionar esto. Si realmente siente la necesidad de hacer algo parecido a un singleton y está de acuerdo con contaminar el espacio de nombres global (y los muchos problemas que pueden resultar), puede cambiar las líneas getInstance()
y del autor exports
a:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Dicho esto, nunca me he encontrado con una situación en un sistema de producción en la que necesite hacer algo como esto. Tampoco he sentido nunca la necesidad de utilizar el patrón singleton en Javascript.