绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
设计模式学习笔记 ———— 简单工厂模式
2019-12-05 11:04:59

# 背景  

  简单工厂模式是很多程序员学习的个设计模式,因为其不但原理简单而且易于上手,在日常工作的代码中也常有体现。今天分享一个基于实现“加”、“减”、“乘”、“除”计算器的需求基于简单工厂模式来实现。

# 错误示范

  在学习简单工厂模式之前,遇到这种需求我是这样实现的:

publicstaticDouble 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) {

thrownewException("使用除法的时候分母不能为0");

}

result = num1 / num2;

break;

default:{}

}

return result;

}

  简单来说是船舰一个方法,然后通过switch case 一个一个的去判断,然后对比中的进行处理,后续如果有其他判断的话,就继续在下面在增加case判断。那么这段代码实现了需求了,是实现了,但是这段代码是的吗?不是。为什么呢?例如现在客户需求增加一个平方算法,我们在case中增加这个算法,却需要加减乘除的运算都得来参与编译,在这个代码的迭代过程中,如果不小心对原有代码进行了误操作,会造成很糟糕的结果,尤其是这个误操作有可能还不会报错……所以我们应该把加减乘除等运算进行分离,修改其中一个不会影响另外的几个,增加平方算法也不影响其他代码。

  声明父类

@Datapublicabstractclass Operation {

privatedouble num1;

privatedouble num2;

protectedabstractdouble getResult();

}

  创建多个计算类用于继承父类并重写getResult方法,这里我分别创建了加减乘除四个类来继承Operation类,并重写getResult()方法

classOperationAddextends Operation{

@Override

protecteddouble getResult() {

returngetNum1() + getNum2();

}

}classOperationSubextends Operation {

@Override

protecteddouble getResult() {

returngetNum1() - getNum2();

}

}classOperationMulextends Operation {

@Override

protecteddouble getResult() {

returngetNum1() * getNum2();

}

}classOperationDivextends Operation {

@Override

protecteddouble getResult() {

returngetNum1() / getNum2();

}

}

  此时,我们只需要简单的写一个工程方法就可以实现业务要求了。这里只是实例代码,很多细节判断没有加,如果是在生成环境中,首先入参肯定要校验是否为null,如果为null会报NPE,上面除法运算类中,应该对分母进行判断,是否为0等等……

class OperationFactory {

publicstatic 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方法

publicstaticvoid main(String[] args) {

Operation operation = OperationFactory.createOperation("*");

operation.setNum1(11d);

operation.setNum2(1.2);

System.out.println(operation.getResult());

}

  返回结果:

13.2

分享好友

分享这个小栈给你的朋友们,一起进步吧。

夜行灯-数字化转型
创建时间:2019-12-04 16:30:15
如果建立《星说》是为了帮助各路豪杰打开数字化思维,运用创始的精神面对本地化业务的转型,那么下一个技术栈,《夜行灯-数字化转型》 希望倡导的,非同行的同路人,留在路上的闪光灯,为后人照明! 我们来看看技术管理的前辈在,数字化企业这条路上,遇到的问题与探索。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • unnamed persona
    栈主

小栈成员

查看更多
  • unnamed person1
  • ?
  • llittle
  • unnamed personq
戳我,来吐槽~