No. Quando il caching del modulo di Node fallisce, il pattern singleton fallisce. Ho modificato l'esempio per eseguire in modo significativo su 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());
Questo fornisce l'output anticipato dall'autore:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Ma una piccola modifica sconfigge la memorizzazione nella cache. Su OSX, fai questo:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Oppure, su Linux:
% ln singleton.js singleton2.js
Quindi modificare la sg2
riga di richiesta in:
var sg2 = require("./singleton2.js");
E bam , il singleton è sconfitto:
{ '1': 'test' } { '2': 'test2' }
Non conosco un modo accettabile per aggirare questo problema. Se senti davvero il bisogno di creare qualcosa di simile al singleton e sei d'accordo con l'inquinamento dello spazio dei nomi globale (e dei molti problemi che possono derivare), puoi modificare le righe getInstance()
e l'autore exports
in:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Detto questo, non mi sono mai imbattuto in una situazione su un sistema di produzione in cui avevo bisogno di fare qualcosa del genere. Inoltre, non ho mai sentito la necessità di utilizzare il pattern singleton in Javascript.