/*
* 工厂模式
* 需要依赖具体环境创建不同实例
* 处理大量具有相同属性的小对象
*
* 比如汽车、不同类型的汽车
* source from: JavaScript Patterns page 148
*
*/
function CarMaker() {};
// 通用方法
CarMaker.prototype.drive = function () {
return "Vroom, I have "+ this.doors + " doors.";
};
// 定义静态工厂方法
CarMaker.factory = function (type) {
var constr = type, // 个性化的汽车工厂
newcar = null; // 生产出的car对象
// 如果构造函数不存在,则发生错误
if (typeof CarMaker[constr] !== "function") {
throw {
name: "Error",
message: constr + " does not 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.SUV = function () {
this.doors = 8;
};
// 应用
var compactCar = CarMaker.factory("Compact"),
suvCar = CarMaker.factory("SUV");
console.log(suvCar.drive()); // Vroom, I have 8 doors.