之前我们用简单工厂方法模式模拟了计算器的功能,现在用工厂方法模式实现以下
先构建一个工厂接口
public interface IFactory { public IOperation create();}
然后加减乘除各个具体的工厂去实现这个接口
public class AddFactory implements IFactory{ public IOperation create() { return new OperationAdd(); }}public class SubFactory implements IFactory{ public IOperation create() { return new OperationSub(); }}public class MulFactory implements IFactory{ public IOperation create() { return new OperationMul(); }}public class DivFactory implements IFactory{ public IOperation create() { return new OperationDiv(); }}
相关的Operation类及接口已在简单工厂模式里面实现。
客户端(计算器)的实现:
public class Calculator { public static void main(String[] args) { IFactory factory = new AddFactory(); IOperation operation = factory.create(); String input1 = "3"; String input2 = "5"; Double d = operation.operate(input1, input2); System.out.println(d.toString()); }}
是不是很简单!看起来和简单工厂模式区别也不大。简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的条件选择动态实例化相关的类,对于客户端来说去除了与具体产品的依赖。但我们在新增一个算法时需要更改工厂类的 switch case分支。这不仅对扩展开放了,也对修改开放了,违背了开放-封闭原则。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。
我们发现,用工厂方法实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,想要加功能,之前是要改工厂类,现在要改客户端,但符合了开放-封闭原则。