模式动机
在上一篇文章《设计模式-创建型之简单工厂模式》中,提到了简单工厂模式最大的缺点就是当需要新增产品时,必须修改工厂类,加入相应的逻辑。在简单工厂模式中,所有的产品都是由一个工厂类负责创建,可能会导致工厂类的逻辑复杂,不便于维护和扩展。因此,为了解决这些问题,工厂模式便诞生了!工厂模式与简单工厂模式最大的区别在于:简单工厂模式只有一个工厂类,工厂模式有多个工厂类,每个产品都有自己单独的工厂类,如下图:
模式定义
工厂模式中,工厂父类负责定义实例化对象的公共接口,工厂子类负责实例化具体的对象,这样便将对象的创建放到了具体某个工厂子类中,降低了耦合度。当新增产品时,只需要新增产品类,以及对应的工厂类即可。
模式结构
工厂模式主要由以下四部分组成:
抽象工厂:抽象出工厂所需属性或行为,如IFactory
具体工厂:具体的某个工厂类,负责创建某个具体的产品,如BenzFactory,BMWFactory
抽象产品:抽象出产品所需属性或行为,ICar
具体产品:具体的某个产品,如BenzCar,BMWCar
代码实现
抽象工厂类
public interface IFactory {
public abstract ICar create();
}
具体工厂类
public class BenzFactory implements IFactory{
@Override
public ICar create() {
return new BenzCar();
}
}
public class BMWFactory implements IFactory{
@Override
public ICar create() {
return new BMWCar();
}
}
抽象产品类
public interface ICar {
public abstract String getName();
}
具体产品类
public class BenzCar implements ICar {
@Override
public String getName() {
return "奔驰";
}
}
public class BMWCar implements ICar {
@Override
public String getName() {
return "宝马";
}
}
客户端测试类
public class Client {
public static void main(String[] args) {
IFactory factory1 = new BenzFactory();
IFactory factory2 = new BMWFactory();
ICar car1 = factory1.create();
ICar car2 = factory2.create();
System.out.println(car1.getName());
System.out.println(car2.getName());
}
}
运行客户端测试类,输出为
奔驰
宝马
模式优缺点
优点
- 相对于简单工厂模式而言,工厂模式汇总每个产品拥有自己独立的工厂,互不干涉,降低了耦合度
- 当需要新增产品时,只需要添加一个产品类和一个与之对应的工厂类,而不需要修改其他代码,灵活性好,扩展性强
缺点
- 由于每个产品都对应一个单独的工厂类,当产品较多时,类的个数会不断增多,这样会有更多的类需要编译和运行,给系统额外增加了一些开销
- 一定程度上增加了系统的复杂程度和理解难度
适用场景
- 相对于简单工厂模式来讲,工厂模式更适合用于产品较多、产品创建过程较为复杂,随时可能新增产品的情况。
总结
此模式相对于简单工厂模式来看,其实就是由一个工厂类变成了多个工厂类,因此可总结为:我有多个汽车厂,帮我生产汽车吧!