否。当 Node 的模块缓存失败时,单例模式就会失败。我修改了示例以在 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 中使用单例模式。