持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
回顾简单工厂模式
上回专栏介绍了简单工厂模式,它的UML类图是这样的
简单工厂模式中使用工厂类创建出加减乘除对应的四个‘产品’,此时我们创建对象是在工厂类中通过switch的case来决定。如果此时计算机需要增加一个取余的方法,我们如何做呢?
- 新建一个取余运算类继承父级运算类Operation
- 在工厂类OperationFactory的switch中新增一个case语句(需要修改这个类的代码)
新建个取余类不会影响什么,但是修改OperationFactory类中的代码就违反了开闭原则,并且每增加一个新算法类都需要修改工厂类中的代码!所以有了工厂方法!
我理解的工厂方法
先看下工厂方法的UML类图
对比两图,可以清晰的看到工厂方法将一个工厂变成了四个工厂,每个工厂都很专一,FactoryAdd工厂只生产加法对象,FactoryDiv工厂只生产除法对象,FactoryMul只生产乘法对象,FactorySub只生产减法对象。
工厂方法是简单工厂的延伸,通过回顾可以看到简单工厂的不足就在于不利于扩展。工厂方法完美解决了这一缺点,它将简单工厂模式中的工厂进一步抽象,抽成了万能工厂,这个万能工厂只提供生产对象的方法,把创建具体对象的权限交给了实现类。
工厂方法模式实现计算器
工厂方法接口
public interface FactoryMethod {
Operation createOperation();
}
实现工厂方法的工厂类
public class FactoryAdd implements FactoryMethod {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public class FactoryDiv implements FactoryMethod {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
public class FactoryMul implements FactoryMethod {
@Override
public Operation createOperation() {
return new OperationMul();
}
}
public class FactorySub implements FactoryMethod {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
测试
public class MainTest {
public static void main(String[] args) {
FactoryMethod factoryMethod = new FactorySub();
Operation operation = factoryMethod.createOperation();
operation.setNum1(2);
operation.setNum2(3);
System.out.println("计算结果是:" + operation.getResult());
}
}
运行结果:
计算结果是:-1
总结
工厂方法模式用到了多态,所以保留了简单工厂优点,客服了它的缺点,工厂方法模式下新增一个取余的功能,不需要修改已有的代码,只需要增加一个生产取余对象的工厂类即可,但是这回增加一些开发量(简单工厂多几行代码,工厂方法需要加一个类)。
如果不知道为什么使用简单工厂的同学请看专栏内的简单工厂文章,硬核分析!