定义
工厂模式属于创建类型模式的一种,主要适用于创建多个简单对象。
其最初的设计中,包含如下角色:
抽象产品角色:它一般是具体产品继承的父类或者实现的接口
具体产品:需要生成的目标对象
产品工厂:负责根据传入的标志生成相应的产品对象
工厂模式中分为三种实现,简单工厂,工厂方法和抽象工厂,随着产品和工厂的关系解偶而逐步降低类之间的耦合度,后面会详细解释相应的实现
简单工厂
public class BMWCar extends Car {
@Override
void createWheel() {}
@Override
void createEngine() { }
@Override
void createElectricalEquipment() {}
@Override
void createBody() {}
}
public class JeepCar extends Car {
@Override
void createWheel() {}
@Override
void createEngine() {}
@Override
void createElectricalEquipment() {}
@Override
void createBody() {}
}
/**
* 访问入口
* 当新增一个车种时必然会修改当前工厂方法
*/
public static Car createCar(int type){
switch (type){
case 1:
return new BMWCar();
case 2:
default:
return new JeepCar();
}
}
上述三个类就构成了一个简单工厂,可以发现其就是简单的满足了定义的三个基本角色:抽象产品+实际产品+工厂,这样的方式隐藏者工厂和产品的强耦合关系(依赖具体的实现类型),即工厂的生产能力是固定的,目前只能生产BMWCar和JeepCar,如果需要生产其他产品,则需要改动createCar方法。当然,简单工厂是可以使用反射来清除强耦合关系的,适当情景下可以采用反射来实现。
工厂方法
public abstract class FactoryCar {
abstract Car create();
}
public class JeepFacory extends FactoryCar {
@Override
Car create() {
return new JeepCar();
}
}
public class BMWFactory extends FactoryCar {
@Override
Car create() {
return new BMWCar();
}
}
上述是工厂方法模式的简单实例,其中出现的四个角色分别是抽象产品+实现产品+抽象工厂+实现工厂,工厂方法和简单工厂的区别就是抽离了工厂角色,将工厂和产品从1:n变成了1:1,优点是隔离了工厂之间的联系,新增产品时不需要改动原有的工厂类和产品类,缺点是每次新增产品都需要新增相应的工厂,导致会出现很多类。像Glide库中就大量使用了该模式,导致其存在大量的工厂,一不小心你就找错了具体的工厂。
抽象工厂
public abstract class AbstractFactory {
abstract Engine createEngine();
abstract Wheel createWheels();
}
public class BMWFactoryImpl extends AbstractFactory {
@Override
Engine createEngine() {
return new Engine() {};
}
@Override
Wheel createWheels() {
return new Wheel() {};
}
}
上述是一个简单的抽象工厂,讲述了每个具体的工厂可以提供不同型号的汽车配件。其中已经没有车这个概念了,对应的车被细化分解了,至此你会发现,工厂模式的演变之路:
1.工厂和产品强耦合,
2.解偶工厂和产品的关系,工厂单一职责
3.细分产品模块,工厂提供单一功能的组件,客户端来组装
总结
使用设计模式的时候,关键还是看我们抽象化的能力和留有余地的能力,当侧重点不同时其抽象的方向可能也会有出入,比如车的行为和属性是非常多的,而且其实在不断变化的,现有的抽象可能满足不了变化,所以需要给自己留下变化的余地。
网友评论