简单工厂模式 模式引入 问题描述 小菜参加面试,面试要求用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。要实现这一程序并不困难,但若未来该程序要增添新的运算符号,而仍想使用这个程序的话,程序应当要设计得耦合性低些,尽量减少增加功能时需要的改动。同时,应该考虑把计算部分独立出来,这样如果未来该windows程序迁移到web版,计算部分也不需要修改。 模式定义 是用一个单独的类来实现具体的实例化过程,避免客户端对具体实例化过程的显式指定。 问题分析 可以用于这个问题。将加减乘除等运算类独立实现,并创建工厂类维护对运算类的使用。之后若需要增加新的运算符号,则只需增加运算类,修改工厂类即可,这也同时降低修改后的重复编译量(松耦合)。
小菜参加面试,面试要求用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。要实现这一程序并不困难,但若未来该程序要增添新的运算符号,而仍想使用这个程序的话,程序应当要设计得耦合性低些,尽量减少增加功能时需要的改动。同时,应该考虑把计算部分独立出来,这样如果未来该windows程序迁移到web版,计算部分也不需要修改。
简单工厂模式(Simple Factory Pattern)是用一个单独的类来实现具体的实例化过程,避免客户端对具体实例化过程的显式指定。
简单工厂模式可以用于这个问题。将加减乘除等运算类独立实现,并创建工厂类维护对运算类的使用。之后若需要增加新的运算符号,则只需增加运算类,修改工厂类即可,这也同时降低修改后的重复编译量(松耦合)。此外,简单工厂模式降了低业务逻辑和界面逻辑的耦合,易于复用(不是复制),若未来该windows程序迁移到web版,业务部分(计算部分)不需要修改。
使用简单工厂模式来解决问题。
Operation,定义抽象类的同时定义其所有子类的公共接口,并定义一个方法getResult(numberA,numberB)用于得到结果;getResult(numberA,numberB)方法实现运算操作;OperationFactory,根据输入参数,使用条件判断调用具体的运算类,实现业务逻辑和界面逻辑的分离。此处我们使用Java语言来实现这一方案,C#语言实现可见原书原版,本项目的所有语言实现可见本项目Github仓库,其中包括:C++,Java,python,读者可按需参阅。
首先定义一个抽象运算类。
public abstract class Operation { public double numberA; public double numberB; public abstract double getResult(); }
定义加减乘除等运算类。
public class OperationAdd extends Operation { @Override public double getResult() { return numberA + numberB; } } public class OperationSub extends Operation { @Override public double getResult() { return numberA - numberB; } } public class OperationMul extends Operation { @Override public double getResult() { return numberA * numberB; } } public class OperationDiv extends Operation { @Override public double getResult() { if(numberB == 0){ throw new RuntimeException("除数不能为0。"); } return numberA / numberB; } }
简单运算工厂类维护创造运算实例的过程。
public class OperationFactory { public static Operation createOperation(char operator) { Operation operation = null; switch (operator) { case '+': operation = new OperationAdd(); break; case '-': operation = new OperationSub(); break; case '*': operation = new OperationMul(); break; case '/': operation = new OperationDiv(); break; } return operation; } }
客户端如下。
public class Calculator { public static void main(String[] args) { Operation operation; char operator; operator = '+'; operation = OperationFactory.createOperation(operator); operation.numberA = 1; operation.numberB = 2; System.out.println(operation.getResult()); } }
运行结果如下。
3
简单工厂模式由三类主要角色组成:
以上述问题为例,结构如下

将类类比为产品,则使用者可以在不清楚类生产的具体过程的情况下,使用不同的产品。