Non. Lorsque la mise en cache du module de Node échoue, ce modèle de singleton échoue. J'ai modifié l'exemple pour fonctionner de manière significative sur 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());
Cela donne le résultat attendu par l'auteur:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Mais une petite modification empêche la mise en cache. Sous OSX, procédez comme suit:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Ou, sous Linux:
% ln singleton.js singleton2.js
Puis changez la sg2
ligne requise en:
var sg2 = require("./singleton2.js");
Et bam , le singleton est vaincu:
{ '1': 'test' } { '2': 'test2' }
Je ne connais pas de moyen acceptable de contourner cela. Si vous vous sentez vraiment la nécessité de faire quelque chose comme singleton et sont d' accord avec la pollution de l'espace de nommage global (et les nombreux problèmes qui peuvent en résulter), vous pouvez changer de l'auteur getInstance()
etexports
lignes en:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Cela dit, je n'ai jamais rencontré de situation sur un système de production où je devais faire quelque chose comme ça. Je n'ai jamais ressenti le besoin d'utiliser le modèle singleton en Javascript.