工厂模式是一种创建类型的模式,目的是为了简化创建对象的流程,它把对象实例化简单封装在一个函数中,然后通过函数调用,实现快速、批量生产对象。
下面例子创建对象 car,然后给它设置几个属性:它的颜色是蓝色,有2个门,8个轮子。最后一个属性实际上是指向函数的指针,意味着该属性是个方法。执行这段代码后,就可以使用对象 car。
Function createCar(color,doors,wheels){
var TempCar = new.Object;
TempCar.color = color;
TempCar.doors = doors;
Tempcar.wheels = wheels;
TempCar.showColor = function(){
alert(this.color);
};
return Tempcar;
}
var car1 = createCar("yellow",2,4); //Bumblebee
var car2 = createCar("blue",2,8); //Optimus prime
car1.showColor(); //输出"yellow"
car2.showColor(); //输出"blue"
本例所有代码都包含在 createCar() 函数中,并返回 car 对象(TempCar)作为函数值。调用此函数,将创建新对象,并赋予它所有必要的属性,复制出一个 car 对象。因此,通过这种方法,可以很容易地创建 car 对象的两个版本(car1 和 car2),它们的属性完全一样。
在上面示例中,每次调用函数createCar(),都要创建新函数 showColor(),意味着每个对象都有自己的 showColor() 版本。而事实上,每个对象都共亨同一个函数。因此可以在工厂函数外定义对象的方法,然后通过属性指向该方法,从而避免这个问题。
function showColor(){
alert(this.color);
}
Function createCar(color,doors,wheels){
var TempCar = new.Object;
TempCar.color = color;
TempCar.doors = doors;
Tempcar.wheels = wheels;
TempCar.showColor = showColor
return Tempcar;
}
var car1 = createCar("yellow",2,4); //Bumblebee
var car2 = createCar("blue",2,8); //Optimus prime
car1.showColor(); //输出"yellow"
car2.showColor(); //输出"blue"
在上面这段重写的代码中,在函数createCar)之前定义了函数showColor)。在createCar0内部,赋予对象一个指向已经存在的showColor0函数的指针。从功能上讲,这样解决了重复创建函数对象的问题。