JS模式之工厂模式和迭代器模式

工厂模式

设计工厂模式的目的是为了创建对象。它通常在类或者类的静态方法中实现,具有下列目标:

  • 当创建相识对象时执行重复操作
  • 在编译时不知道具体类型的情况下,为工厂客户提供一种创建对象的接口

通过工厂方法创建的对象在设计上都继承了相同的父对象这个思想,它们都是实现专门功能的特定子类。有时候公共父类是一个包含了工厂方法的同一个类。

看一个汽车工厂实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function CarMaker() {}
CarMaker.prototype.drive = function() {
return "Vroom, I have " + this.doors + " doors";
}
CarMaker.factory = function(type) {
var constr = type, newcar;
if(typeof CarMaker[constr] !== "function") {
throw {
name: "Error",
message: constr + " doesn't exist"
}
}
if(typeof CarMaker[constr].prototype.drive !== "function") {
CarMaker[constr].prototype = new CarMaker();
}
newcar = new CarMaker[constr]();
return newcar;
}
CarMaker.Compact = function() {this.doors = 4}
CarMaker.Convertible = function() {this.doors = 2}
CarMaker.SUV = function() {this.doors = 24;}

再看看使用:

1
2
3
4
5
6
var corolla = CarMaker.factory('Compact');
var solstice = CarMaker.factory('Convertible');
var cherokee = CarMaker.factory('SUV');
corolla.drive()
solstice.drive()
chrokee.drive()

实现该工厂模式并没有特别的困难,所有需要做的就是寻找能够创建所需类型对象的构造函数。

迭代器模式

提起迭代器就会联想起ES6新支持的迭代协议,迭代器,可迭代对象;其实迭代器模式就是跟ES6的迭代器类似;

通常的迭代器模式中,有一个包含各种数据集合的对象。该数据可能存储在一个复杂数据结构内部,而要提供一种简单的方法能够访问数据结构中每个元素。对象的消费者并不需要知道如何组织数据,所有需要做的就是取出单个数据进行工作。

在迭代器模式中,需要提供一个next方法,还可以提供一个较为方便的hasNext方法,看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var agg = (functiono() {
var index = 0,
data = [1, 2, 3, 4, 5],
length = data.length;
return {
next: function() {
var element;
if(!this.hasNext()) {
return null;
}
element = data[index];
index = index +2;
return element;
},
hasNext: function() {
return index < length;
}
}
})();

除了上面的两个方法,还可以提供更简单的访问方式及多次迭代数据的能力,你的对象可以提供额外的便利方法:

rewind():重置指针到初始位置。
current(): 返回当前元素,因为不可能在不前进指针的情况下使用next()执行该操作。

1
2
3
4
5
6
7
8
9
10
11
12
var agg = (function() {
// ...
return {
// ...
rewind: function() {
index = 0;
},
current: function() {
return data[index]
}
}
})()