# 背景 程序员
简单工厂模式是不少程序员学习的第一个设计模式,由于其不但原理简单并且易于上手,在平常工做的代码中也常有体现。今天分享一个基于实现“加”、“减”、“乘”、“除”计算器的需求基于简单工厂模式来实现。算法
# 错误示范设计模式
在学习简单工厂模式以前,遇到这种需求我是这样实现的:ide
public static Double Calculator(Double num1, Double num2, String symbol) throws Exception { Double result = 0.0D; if (symbol == null || num1 == null || num2 == null) { return result; } switch (symbol) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": if (num2 == 0) { throw new Exception("使用除法的时候分母不能为0"); } result = num1 / num2; break; default:{} } return result; }
简单来讲是船舰一个方法,而后经过switch case 一个一个的去判断,而后对比中的进行处理,后续若是有其余判断的话,就继续在下面在增长case判断。那么这段代码实现了需求了,是实现了,可是这段代码是优秀的吗?不是。为何呢?例如如今客户需求增长一个平方算法,咱们在case中增长这个算法,却须要加减乘除的运算都得来参与编译,在这个代码的迭代过程当中,若是不当心对原有代码进行了误操做,会形成很糟糕的结果,尤为是这个误操做有可能还不会报错……因此咱们应该把加减乘除等运算进行分离,修改其中一个不会影响另外的几个,增长平方算法也不影响其余代码。学习
声明父类测试
@Data public abstract class Operation { private double num1; private double num2; protected abstract double getResult(); }
建立多个计算类用于继承父类并重写getResult方法,这里我分别建立了加减乘除四个类来继承Operation类,并重写getResult()方法spa
class OperationAdd extends Operation{ @Override protected double getResult() { return getNum1() + getNum2(); } } class OperationSub extends Operation { @Override protected double getResult() { return getNum1() - getNum2(); } } class OperationMul extends Operation { @Override protected double getResult() { return getNum1() * getNum2(); } } class OperationDiv extends Operation { @Override protected double getResult() { return getNum1() / getNum2(); } }
此时,咱们只须要简单的写一个工程方法就能够实现业务要求了。这里只是实例代码,不少细节判断没有加,若是是在生成环境中,首先入参确定要校验是否为null,若是为null会报NPE,上面除法运算类中,应该对分母进行判断,是否为0等等……设计
class OperationFactory { public static Operation createOperation(String operate) { Operation operation; switch (operate) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; default:{ operation = new OperationAdd(); } } return operation; } }
测试main方法code
public static void main(String[] args) { Operation operation = OperationFactory.createOperation("*"); operation.setNum1(11d); operation.setNum2(1.2); System.out.println(operation.getResult()); }
返回结果:blog
13.2