Nie. Gdy buforowanie modułu Node nie powiedzie się, pojedynczy wzorzec nie powiedzie się. Zmodyfikowałem przykład, aby działał sensownie na 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());
Daje to wynik, jakiego przewidywał autor:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Ale mała modyfikacja pokonuje buforowanie. W systemie OSX zrób to:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Lub w systemie Linux:
% ln singleton.js singleton2.js
Następnie zmień sg2
wymaganą linię na:
var sg2 = require("./singleton2.js");
I bam , singleton został pokonany:
{ '1': 'test' } { '2': 'test2' }
Nie znam akceptowalnego sposobu obejścia tego. Jeśli naprawdę czujesz potrzebę stworzenia czegoś podobnego do singletona i nie przeszkadza ci zanieczyszczanie globalnej przestrzeni nazw (i wiele problemów, które mogą z tego wyniknąć), możesz zmienić autora getInstance()
i exports
wiersze na:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
To powiedziawszy, nigdy nie spotkałem się z sytuacją w systemie produkcyjnym, w której musiałbym zrobić coś takiego. Nigdy też nie czułem potrzeby używania wzorca singleton w Javascript.