いいえ。 ノードのモジュールキャッシュが失敗すると、そのシングルトンパターンは失敗します。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");
そして、bam、シングルトンは打ち負かされています:
{ '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でシングルトンパターンを使用する必要性を感じたことはありません。