设计模式之简单工厂
来源:互联网 发布:java redis zadd 用法 编辑:程序博客网 时间:2024/06/09 18:50
编程不仅是一门技术,还是一门艺术。简单,精炼,优雅是我们的追求。在现实编程环境中,需求永远不是固定的,这就需要我们在做设计研发的时候,必须考虑到程序的可拓展性和后期可维护性。简单凝练的代码提高后期维护的简易性,良好的设计可以提高代码的拓展性,设计模式能够实现这些功能。
现在我们以计算器模型来简单讨论一下简单工厂的设计模式
记得还是刚入门的时候,写过这样的代码
public class Operation {public static double getResult(double firstNumber,double secondNumber,String operator){ double result =0l; switch(operator){ case "+": result = firstNumber+secondNumber;break; case "-": result = firstNumber-secondNumber;break; case "*": result = firstNumber*secondNumber;break; case "/": result = firstNumber/secondNumber;break; } return result;}}分析:
这样的代码也可以实现功能(有一些bug,暂时不讨论,比如double的上限,除法的规则等)。但是,如果要增加一个平方运算(拓展性),或者修改除法的bug(维护性)等,都需要对这个Operation做修改,这个只是很简单的业务逻辑,试想一下,如果每个case分支有成千上百行的业务逻辑,修改起来相当棘手了。
因此需要一种方式来重构代码。
public class Operation {private double firstNumber;private double secondNumber;public double getResult(){return 0l;}public double getFirstNumber() {return firstNumber;}public void setFirstNumber(double firstNumber) {this.firstNumber = firstNumber;}public double getSecondNumber() {return secondNumber;}public void setSecondNumber(double secondNumber) {this.secondNumber = secondNumber;}}
加法类
public class Add extends Operation {public Add(double firstNumber,double secondNumber){this.setFirstNumber(firstNumber);this.setSecondNumber(secondNumber);}public double getResult(){return this.getFirstNumber()+this.getSecondNumber();}}减法类
public class Sub extends Operation {public Sub(double firstNumber,double secondNumber){this.setFirstNumber(firstNumber);this.setSecondNumber(secondNumber);}public double getResult(){return this.getFirstNumber()-this.getSecondNumber();}}
乘法类
public class Mul extends Operation {public Mul(double firstNumber,double secondNumber){this.setFirstNumber(firstNumber);this.setSecondNumber(secondNumber);}public double getResult(){return this.getFirstNumber()*this.getSecondNumber();}}除法类
public class Div extends Operation {public Div(double firstNumber,double secondNumber){this.setFirstNumber(firstNumber);this.setSecondNumber(secondNumber);}public double getResult(){return this.getFirstNumber()/this.getSecondNumber();}}
...
工厂类
public class OperatorFactory {public static Operation createOperate(String operate,double firstNumber,double secondNumber){Operation oper=null; switch(operate){ case "+": oper = new Add(firstNumber,secondNumber);break; case "-": oper = new Sub(firstNumber,secondNumber);break; case "*": oper = new Mul(firstNumber,secondNumber);break; case "/": oper = new Div(firstNumber,secondNumber);break; } return oper;}}调用方式
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubOperation oper = OperatorFactory.createOperate("+",30,20);System.out.println(oper.getResult());}}
分析:
这样重构之后,如果再添加其他的运算方法,只是需要新增一些Operation的子类就可以了,详细的算法可以新增到子类中,这样就不需要改造原有的运算方法了。相对维护代码来说,也简便了许多。在实际框架设计中,简单工厂模式和普遍,比如,jdbc中,不同数据库的数据源连接(mysql,oracle,sqlserver等等),都可以采用简单工厂模式来提高程序的简易性。
github源码下载
0 0
- 设计模式 之简单工厂+ 工厂模式
- 设计模式 之 简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂.
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- POJ 1088
- PE文件结构(PE文件头一)
- Android自定义圆形进度条
- PE文件结构(PE文件头二)
- swift 项目 简易计算器
- 设计模式之简单工厂
- Number Sequence(杭电1711)(KMP)
- 学习Unity3D第十四天之异常和封装。
- 基于ZedBoard的Webcam设计(三):视频的采集和动态显示
- 我的第一个html
- 后台服务如何查问题
- POJ 1338
- java 多线程断点下载demo
- 编译原理结构框架7语义分析与中间代码生成