一: 一般的工厂模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
return o;
}
var p1 = new createPerson("nick", 90, "doctor");
二:
function Create(){}
Create.factory = function(childOperation){
return new Create[childOperation];
};
Create.Link = function(){
this.setName = function(name){
this.name = name;
};
this.getName = function(){
console.log(this.name);
};
};
Create.Another = function(){
this.console = function(){
console.log("每颗心都寂寞");
};
};
var p1 = Create.factory("Link");
p1.setName("Nick");
p1.getName();// "Nick"
var p2 = Create.factory("Another");
p2.console();// 每颗心都寂寞
说明:
工厂模式定义一个用于创建对象的接口(factory函数提供接口,然后 return new XXX...) 该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
这里的 Create.Link 就是子类,可以定义很多个跟他一样的子类,然后在里面定义不同的类,来创造不同的对象。
下面是一个更完整的例子:
// 父构造函数
function CarMaker(){}
// a method of parent
CarMaker.prototype.drive = function(){
console.log("Vroom, I have " + this.doors + " doors");
};
// 静态工厂方法
CarMaker.factory = function(type){
var constr = type,
newcar;
// 如果构造函数不存在,则发生错误
if(typeof CarMaker[constr] !== "function"){ // CarMaker[Compact]存在 且 this.doors = 4;
throw{
name : "Error",
message : constr + " doesn't exist"
};
}
// 在这里,构造函数是已知存在的
// 我们使得原型继承父类,但仅继承一次
if(typeof CarMaker[constr].prototype.drive !== "function"){ // CarMaker[Compact].prototype.drive
console.log("CarMaker[constr].prototype.drive 不存在 要new 一个");
CarMaker[constr].prototype = new CarMaker();// CarMaker[Compact].prototype = new CarMaker();
}
// 创建一个新的实例
newcar = new CarMaker[constr]();// 继承了CarMaker
// 可选择的调用一些方法然后返回
return newcar;
};
// 定义特定的汽车制造商
CarMaker.Compact = function(){
this.doors = 4;
};
CarMaker.Convertible = function(){
this.doors = 2;
};
CarMaker.SUV = function(){
this.doors = 24;
};
var corolla = CarMaker.factory('Compact');
var solstice = CarMaker.factory('Convertible');
var cherokee = CarMaker.factory('SUV');
corolla.drive();
solstice.drive();
cherokee.drive();