Hayır . Düğümün modül önbelleğe alma işlemi başarısız olduğunda, bu tekli model başarısız olur. Örneği OSX'te anlamlı bir şekilde çalışacak şekilde değiştirdim:
var sg = require("./singleton.js");
var sg2 = require("./singleton.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Bu, yazarın beklediği çıktıyı verir:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Ancak küçük bir değişiklik önbelleğe almayı geçersiz kılar. OSX'te şunu yapın:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Veya Linux'ta:
% ln singleton.js singleton2.js
Ardından, sg2gerekli satırını şu şekilde değiştirin:
var sg2 = require("./singleton2.js");
Ve bam , singleton yenildi:
{ '1': 'test' } { '2': 'test2' }
Bunu aşmanın kabul edilebilir bir yolunu bilmiyorum. Eğer gerçekten tekil benzeri bir şey yapma ihtiyacı hissediyorsanız ve küresel ad alanını kirletmekte sorun yaşıyorsanız (ve ortaya çıkabilecek birçok sorunu), yazarın getInstance()ve exportssatırlarını şu şekilde değiştirebilirsiniz:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Bununla birlikte, bir prodüksiyon sisteminde böyle bir şey yapmam gereken bir duruma hiç rastlamadım. Ayrıca Javascript'te tekli kalıbı kullanma ihtiyacı hissetmedim.