常用的Node.js设计模式
本文介绍了常见的设计模式,单例模式、观察者模式、工厂模式。而且还涉及到依赖注入、中间件等功能的介绍。
什么是设计模式
A design pattern is a general,reusable solution to a commonly occurring problem.
单例模式
一般认为单例模式就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在就直接返回,如果不存在则会创建对象,并将该对象保存在静态变量中,当下次请求时,则直接返回该对象,这就确保了一个类只有一个实例对象。
1 | // single-class.js |
_instance
变量要放在单例方法之外,否则将无法实现单例模式。原因是调用单例方法时每次都会将其赋值为null,而放在单例方法之外,调用单例函数不会影响到_instance
变量的值。
1 | // single-app.js |
singleObj2和singleObj1是一样的,只是在new对象时传的时间不同,这个时间只要用来判断是否new了新的对象。运行single-app.js,我们发现两次运行结果是相同的,因此说明第二次new单例对象时,并没有创建新的Class类对象,而是返回了第一次创建的Class类对象。这样就实现了单例模式。
观察者模式
一个对象维护着一个依赖/观察者列表,并在依赖状态改变时,自动的通知观察者列表中的每个成员。要实现观察者模式,可以借助EventEmitter
。
1 | // MyFancyObservable.js |
这样就创建了一个可被观察的对象。为它添加些功能
1 | MyFancyObservable.prototype.test = function(name){ |
现在观察者可以发出事件了,emit event
。我们执行observable.test('john')
测试一下。1
2
3
4
5
6
7
8
9
10var MyFancyObservable = require("./MyFancyObservable");
var observable = new MyFancyObservable();
observable.on('hello',function(name){
console.log(name);
});
observable.on('hello',function(name){
console.log("test:",name);
});
observable.test("john"); // john;test:john
工厂模式
工厂模式使我们不需要使用构造器,而是通过提供一个泛型(通用)接口来创建对象。这种模式在创建过程变得复杂时会非常有用。1
2
3
4
5
6
7
8
9
10function MyClass (options) {
this.options = options;
}
function create(options) {
// modify the options here if you want
return new MyClass(options);
}
module.exports.create = create;