工厂模式 详解

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类;

创建类模式

角色

  • 抽象工厂角色(AbstractFactory):模式的核心,提供具体工厂角色必须实现的接口或者必须继承的父类;
  • 具体工厂角色(ConcreteFactory):含有和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品的对象;
  • 抽象产品角色(AbstractProduct): 负责具体产品角色的定义的接口或抽象类;
  • 具体产品角色(ConcreteProduct): 被具体工厂角色创建的对象;

从网上找到的例图
enter image description here


适用场景

  • 当一个类不知道它所创建的对象的类的时候;
  • 当一个类希望由它的子类来指定它所创建的对象的时候;
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部话的时候;

例子


实现代码

/**
 * Created by George on 16/7/3.
 */
//汽车
function Car(options) {
    this.doors = options.doors || 4;
    this.state = options.state || "new";
    this.color = options.color || "white";
}

//卡车类
function Truck(options) {
    this.state = options.state || "used";
    this.wheelSize = options.wheelSize || "large";
    this.color = options.color || "blue";
}

// 工厂
function VehicleFactory() {}
// 定义该工厂factory的原型和试用工具,默认是car
VehicleFactory.prototype.vehicleClass = Car;
// 创建工厂方法
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);
console.log(car);

//创建生成卡车的工厂实例
var movingTruck = carFactory.createVehicle({
    vehicleType : "truck",
    state : "new",
    color : "red",
    wheelSize : "small",
});
console.log(car instanceof Truck);
console.log(movingTruck);

///

//将VehicleFactory归入子类来创建一个构建Truck的工厂类
function TruckFactory() {}
TruckFactory.prototype = new VehicleFactory();
// 定义该工厂factory的原型和试用工具,默认是car
TruckFactory.prototype.vehicleClass = Truck;

var truckFactory = new TruckFactory();
var bigTruck = truckFactory.createVehicle({
    state : "bad",
    color : "black",
    wheelSize : "big",
});
console.log(bigTruck instanceof Truck);
console.log(bigTruck);

实现结果:
这里写图片描述


优缺点

  1. 可以使代码结构清晰,有效地封装变化,降低耦合度。通过工厂模式,将产品的实例化封装起来,使得调用者根本无须关心产品的实例化过程,只需依赖工厂就可以得到自己想要的产品;
  2. 对调用者屏蔽具体的产品类,只关心产品的接口;
  3. 扩展性高,如果想要增加一个产品,只要扩展一个工厂类就可以;

注意的是
1. 每次增加一个产品的时候,都要增加一个具体类和对象实现工厂,使得系统中类的个数成倍的增加,在一定程度上增加了系统的复杂度,同时也增加系统具体类的依赖;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值