设计模式之简单工厂

编程艺术在于代码的可拓展性和维护性。本文通过一个计算器模型介绍简单工厂设计模式,探讨如何通过该模式提高代码的可维护性和拓展性。以避免在添加新功能或修复错误时对原有代码造成大量改动。文章展示了加法、乘法等运算类的实现,并通过工厂类简化了代码结构,便于后续扩展。
摘要由CSDN通过智能技术生成

编程不仅是一门技术,还是一门艺术。简单,精炼,优雅是我们的追求。在现实编程环境中,需求永远不是固定的,这就需要我们在做设计研发的时候,必须考虑到程序的可拓展性和后期可维护性。简单凝练的代码提高后期维护的简易性,良好的设计可以提高代码的拓展性,设计模式能够实现这些功能。

现在我们以计算器模型来简单讨论一下简单工厂的设计模式

记得还是刚入门的时候,写过这样的代码

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 stub
		Operation oper = OperatorFactory.createOperate("+",30,20);
		System.out.println(oper.getResult());
	}


}

分析:

这样重构之后,如果再添加其他的运算方法,只是需要新增一些Operation的子类就可以了,详细的算法可以新增到子类中,这样就不需要改造原有的运算方法了。相对维护代码来说,也简便了许多。在实际框架设计中,简单工厂模式和普遍,比如,jdbc中,不同数据库的数据源连接(mysql,oracle,sqlserver等等),都可以采用简单工厂模式来提高程序的简易性。

github源码下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值