文章目录
  1. 1. 什么是设计模式
    1. 1.1. 单例模式
    2. 1.2. 观察者模式
    3. 1.3. 工厂模式

本文介绍了常见的设计模式,单例模式、观察者模式、工厂模式。而且还涉及到依赖注入、中间件等功能的介绍。

什么是设计模式

A design pattern is a general,reusable solution to a commonly occurring problem.

单例模式

一般认为单例模式就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在就直接返回,如果不存在则会创建对象,并将该对象保存在静态变量中,当下次请求时,则直接返回该对象,这就确保了一个类只有一个实例对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// single-class.js
var _instance = null;
module.exports = function(time){
function Class(time){
this.name = "kenan";
this.book = "Node.js";
this.time = time;
}
Class.prototype = {
show : function(){
console.log(this.book," is write by ",this.name,",time is ",this.time);
}
}
this.getInstance = function(){
if(_instance === null){
_instance = new Class(time);
}
return _instance;
}
}

_instance变量要放在单例方法之外,否则将无法实现单例模式。原因是调用单例方法时每次都会将其赋值为null,而放在单例方法之外,调用单例函数不会影响到_instance变量的值。

1
2
3
4
5
6
7
8
9
10
// single-app.js
var Single = require("./single-class");

var singleObj1 = new Single("2010-03-01");
var singleClass1 = singleObj1.getInstance();
singleClass1.show(); // Node.js is write by kenan ,time is 2010-03-01

var singleObj2 = new Single("2010-03-01");
var singleClass2 = singleObj2.getInstance();
singleClass2.show(); // Node.js is write by kenan ,time is 2010-03-01

singleObj2和singleObj1是一样的,只是在new对象时传的时间不同,这个时间只要用来判断是否new了新的对象。运行single-app.js,我们发现两次运行结果是相同的,因此说明第二次new单例对象时,并没有创建新的Class类对象,而是返回了第一次创建的Class类对象。这样就实现了单例模式。

观察者模式

一个对象维护着一个依赖/观察者列表,并在依赖状态改变时,自动的通知观察者列表中的每个成员。要实现观察者模式,可以借助EventEmitter

1
2
3
4
5
6
7
8
// MyFancyObservable.js
var util = require('util');
var EventEmitter = require('events').EventEmitter;

function MyFancyObservable(){
EventEmitter.call(this);
}
util.inherits(MyFancyObservable,EventEmitter);

这样就创建了一个可被观察的对象。为它添加些功能

1
2
3
4
5
MyFancyObservable.prototype.test = function(name){
this.emit("hello",name);
}

module.exports = MyFancyObservable;

现在观察者可以发出事件了,emit event。我们执行observable.test('john')测试一下。

1
2
3
4
5
6
7
8
9
10
var 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
10
function MyClass (options) {  
this.options = options;
}

function create(options) {
// modify the options here if you want
return new MyClass(options);
}

module.exports.create = create;

文章目录
  1. 1. 什么是设计模式
    1. 1.1. 单例模式
    2. 1.2. 观察者模式
    3. 1.3. 工厂模式