いいえ 。ノードのモジュールキャッシングが失敗すると、そのシングルトンパターンは失敗します。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());
これにより、作成者が予想した出力が得られます。
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
ただし、小さな変更を加えるとキャッシングが無効になります。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());
または、Linuxの場合:
% ln singleton.js singleton2.js
次に、sg2
require行を次のように変更します。
var sg2 = require("./singleton2.js");
そして、バム、シングルトンは敗北しました:
{ '1': 'test' } { '2': 'test2' }
これを回避するための許容できる方法がわかりません。シングルトンのようなものを作成する必要性を本当に感じ、グローバル名前空間(および結果として生じる可能性のある多くの問題)を汚染しても問題がない場合は、作成者getInstance()
とexports
行を次のように変更できます。
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
とは言うものの、私はこのようなことをする必要がある本番システムの状況に遭遇したことはありません。また、Javascriptでシングルトンパターンを使用する必要性を感じたことはありません。