编程不只是一门技术,更是一门艺术!
工厂模式
好处
- 解耦,将对象的创建和使用分离开,用工厂来管理对象的创建逻辑,对使用者完全透明,可以防止使用者因为创建逻辑出错而导致的错误。
- 减少代码的重复,如果创建一个对象非常复杂,但是很多地方都需要使用到,这样的话就会有许多重复代码,使用工厂模式可以达到将创建对象的过程封装复用的目的,减少代码的复用。
- 统一管理,当业务逻辑发生变化时,不需要找到所有创建该对象的地方去逐个修改,只需要在工厂里修改即可,便于维护。
简单工厂
public static Operation createOperation(String operation) {
Operation res = null;
switch (operation) {
case "+":
res = new Add();
break;
case "-":
res = new Sub();
break;
}
return res;
}
优点:工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类,对于客户端来说隔离了对具体产品的依赖。
缺点:违背了开闭原则,当需要新增运算功能时,除了需要增加运算类(扩展),还需要在工厂类中添加case分支(修改)。
工厂方法
工厂方法是简单工厂的进一步抽象与推广。根据依赖转置原则,将工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后将原来简单工厂中的每一条case分支都转换成一个工厂类,负责生产某一个具体的类。这样当需要新增功能时,只需要只需要新增一个运算类和一个该运算对应的工厂类,并不需要修改代码,满足开闭原则。工厂方法将简单工厂中的内部判断逻辑移到了客户端,如果想要增加功能,原来是改工厂类,现在是改客户端。
抽象工厂
用于创建一组有关联关系的对象的工厂。
基础版本
好处:便于改变产品系列(对应图中1或2),只需要改变具体的工厂即可使用不同的产品系列。
缺点:当需要新增一个产品C时,不仅要增加三个类,还要对工厂接口和所有的工厂实现类进行修改,维护成本高。
反射版本
这里用反射来完成依赖注入的思想,通过字符串变量然后使用反射的技术来创建类,替换掉了 switch / if 语句。所有用简单工厂的场景都可以考虑使用反射技术来去除 switch / if 语句,解除分支判断带来的耦合。