工厂模式是一种创建型模式。它的特点在于,提供一个通用的接口来创建对象,不显式地要求使用一个构造函数,我们可以指定我们所希望创建的对象工厂的类型。
假设有一个UI工厂,我们要创建一个UI组件的类型。不需要直接使用new运算符或者通过另一个创建型构造函数创建这个组件,而是要求Factory对象创建一个新的组件。我们通知Factory需要什么类型的对象,它会进行实力化,然后将它返回给我们。
PS.除非为创建对象提供一个接口是我们正在编写的库或框架的设计目标,否则建议坚持使用显示构造函数,以避免不必要的开销。
//Car构造函数
function Car(options){
this.doors=options.doors||4
this.state=options.state||"brand new"
this.color=options.color||'silver'
}
//Truck构造函数
function Truck(options){
this.state=options.state||'used'
this.wheelSize=options.wheelSize||'large'
this.color=options.color||'blue'
}
//vehicle工厂
function VehicleFactory(){ }
VehicleFactory.prototype.vehicleClass=Car
//创建新vehicle实例的工厂方法
VehicleFactory.prototype.createVehicle=function(options){
if(options.vehicleType==="car"){
this.vehicleClass=Car
}else{
this.vehicleClass=Truck
}
return new this.vehicleClass(options)
}
//创建生成汽车的工厂实例
var carFactory=new VehicleFactory()
var car=carFactory.createVehicle({
vehicleType:'car',
color:'yellow',
doors:6
})
console.log(car instanceof Car) //true
console.log(car) //Car对象
例子来源《JavaScript设计模式》人民邮电出版社