Không. Khi bộ nhớ đệm mô-đun của Node bị lỗi, mẫu singleton đó không thành công. Tôi đã sửa đổi ví dụ để chạy có ý nghĩa trên 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());
Điều này cho kết quả mà tác giả dự đoán:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Nhưng một sửa đổi nhỏ sẽ đánh bại bộ nhớ đệm. Trên OSX, hãy làm như sau:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Hoặc trên Linux:
% ln singleton.js singleton2.js
Sau đó, thay đổi sg2
dòng yêu cầu thành:
var sg2 = require("./singleton2.js");
Và bam , singleton đã bị đánh bại:
{ '1': 'test' } { '2': 'test2' }
Tôi không biết một cách có thể chấp nhận được để giải quyết vấn đề này. Nếu bạn thực sự cảm thấy cần phải tạo ra một cái gì đó giống như singleton và đồng ý với việc làm ô nhiễm không gian tên chung (và nhiều vấn đề có thể dẫn đến), bạn có thể thay đổi tác giả getInstance()
và exports
dòng thành:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Điều đó nói rằng, tôi chưa bao giờ gặp phải tình huống trong một hệ thống sản xuất mà tôi cần phải làm bất cứ điều gì như thế này. Tôi cũng chưa bao giờ cảm thấy cần phải sử dụng mẫu singleton trong Javascript.