工厂模式是定义类型的最基本方法,也是JavaScript最常用的一种开发模式。它把对象实例化简单封装在一个函数中,然后通过调用函数,实现快速、批量生产实例对象。
【示例1】下面示例设计一个Car类型,包含3个属性:汽车颜色、驱动轮数、百公里油耗,同时定义一个方法,用来显示汽车颜色。
function Car(color,drive,oil) { //汽车类
var _car = new Object(); //临时对象
_car.color = color; //初始化颜色
_car.drive = drive; //初始化驱动轮数
_car.oil = oil; //初始化百公里油耗
_car.showColor = function() { //方法,提示汽车颜色
console.log(this.color);
};
return _car; //返回实例
}
var car1 = Car("red", 4, 8);
var car2 = Car("blue", 2, 6);
car1.showColor(); //输出 "red"
car2.showColor(); //输出 "blue"
上面代码是一个简单的工厂模式类型,使用Car类可以快速创建多个汽车实例,它们的结构相同,但是属性不同,可以初始化不同的颜色、驱动轮数和油耗指标。
【示例2】在类型中,方法就是一种行为或操作,它能够根据初始化参数完成特定任务,具有共性。因此,可以考虑把方法置于Car()函数外面,避免每次实例化时,都要创建一次函数,让每个实例共享同一个函数。
function showColor(){ //公共方法,提示汽车颜色
console.log(this.color);
};
function Car(color,drive,oil) { //汽车类
var _car = new Object(); //临时对象
_car.color = color; //初始化颜色
_car.drive = drive; //初始化驱动轮数
_car.oil = oil; //初始化百公里油耗
_car.showColor = showColor; //引用外部函数
return _car; //返回实例
}
在上面这段重写的代码中,在函数Car()之前定义了函数showColor()。在Car()内部,通过引用外部showColor() 函数,避免了每次实例化时都要创建一个新的函数。从功能上讲,这样解决了重复创建函数的问题;但是从语义上讲,该函数不太像是对象的方法。