设计模式之简单工厂

来源:互联网 发布: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
原创粉丝点击