Nein. Wenn das Modul-Caching des Knotens fehlschlägt, schlägt dieses Singleton-Muster fehl. Ich habe das Beispiel so geändert, dass es unter OSX sinnvoll ausgeführt wird:
var sg = require("./singleton.js");
var sg2 = require("./singleton.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Dies gibt die vom Autor erwartete Ausgabe:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Eine kleine Modifikation verhindert jedoch das Caching. Gehen Sie unter OSX folgendermaßen vor:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Oder unter Linux:
% ln singleton.js singleton2.js
Ändern Sie dann die sg2
erforderliche Zeile in:
var sg2 = require("./singleton2.js");
Und bam , der Singleton ist besiegt:
{ '1': 'test' } { '2': 'test2' }
Ich kenne keinen akzeptablen Weg, um das zu umgehen. Wenn Sie wirklich das Bedürfnis haben, etwas Singleton-ähnliches zu machen und den globalen Namespace (und die vielen Probleme, die daraus entstehen können) zu verschmutzen, können Sie den Autor getInstance()
und die exports
Zeilen ändern in:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Trotzdem bin ich noch nie auf ein Produktionssystem gestoßen, in dem ich so etwas tun musste. Ich hatte auch nie das Bedürfnis, das Singleton-Muster in Javascript zu verwenden.