Node.js的单例设计

  在大多数语言中,在整个应用程序中分享一个对象是一个 复杂过程,这些单例实现都很复杂,需要一些额外修改代码才能工作,在Node中,对象类型是缺省的,每个模块都跨应用范围分享,这样你不需要额外类和代码。

  当创建一个新模块时,你定义的变量和函数缺省是私有的,你需要使用module.exports来定义你的接口,并且使其公开public。

// module.js 
var a = 1; // Private 
module.exports = { 
  b: 2 // Public 
}; 
      
var m = require('module'); 
console.log(m.a); // undefined 
console.log(m.b); // 2 

  在设计模块时有很多决策需要决定,我在哪里定义我的函数,在哪里输出我的模块为公开接口?我应当定义我的公开函数直接作为模块的属性吗?

  但是保证单一来源是一个遵循的规则,你应该可以在一个地方看到确切的public或private以及到底是怎么回事。同时定义和导出你的公共变量,你得有一个私有和公有的明确分离。而不是让人不断搜查代码以发现代码块函数是如何被导出的。

// Private 
var TWO = 2; 
function sum(x, y) { 
       return x + y; 
} 
// Public 
module.exports = { 
       x: 5, 
       add2: function(num) { 
              return sum(TWO, num); 
       }, 
       addX: function(num) { 
              return sum(module.exports.x, num); 
       } 
} 

  其次是避免导出别名,一个Node老手应该知道不会有第二种方式导出你的代码,exports是model.exports的别名,它也可以用作定义你的公共接口,但是必须小心仔细,因为它是module.exports的别名,设置独立的属性也许正常工作,但是如果设置整个exports或module.exports对象,你会中断这两者连接,这样exports就再也不会工作了。

  当你定义公共接口时,一定坚持使用module.exports。

  exports在一个例外情况下有用,当从私有代码引用公共模块时会有一点作用,取代每次你需要x数值时调用module.exports.x,你能通过exports.x保持你的个性,但是记住为了能让其正常工作,你再也不能给再分配别名了。

// Public
exports = module.exports = {
   /* … */
}

单例模式

Node.js设计定制类型

Node.js教程系列

Node.js编程之道