## 场景需求:

现在要实现任意两个数字的加、减、乘、除运算;

一, 最初的实现

OperationTest test = new OperationTest();
		double num1 = 10;
		double num2 = 4;
		String flag = "+";
		test.getResult(num1, num2, flag);

getResult()实现根据不同的运算符号进行任务分发

public void getResult(double num1, double num2, String flag) {
		switch (flag) {
		case "+":
			jia(num1, num2);
			break;
		case "-":
			jian(num1, num2);
			break;
		case "*":
			chen(num1, num2);
			break;
		case "/":
			chu(num1, num2);
			break;
		default:
			System.out.println("运算符号有误");
			break;
		}
	}

具体的运算逻辑代码(一些运算异常情况这里就先不处理了)

public double jia(double a, double b) {
		System.out.println(a + b);
		return a + b;
	}

	public double jian(double a, double b) {
		System.out.println(a - b);
		return a - b;
	}
	
	public double chen(double a, double b) {
		System.out.println(a * b);
		return a * b;
	}
	
	public double chu(double a, double b) {
		System.out.println(a / b);
		return a / b;
	}

 

二, 工厂模式的实现

存在即合理,设计模式也是如此,因为有需要才会出现;现在需求有变动,需要增加求平方的操作;

按照最初的实现思路的话,就是在getResult()方法里加上一个处理平方的标识符,然后新增一个处理平方的具体运算方法;后期再每扩展一次就修改一次,如此一来代码会逐步变的臃肿,而且改动的过程中不排除对原有的代码功能造成影响;

然后就有了将每种运算单独拿出来作为一个类,业务需要拓展的时候只需要新增类就可以了,这样的好处是代码更显条理清晰可读性强,另外分离出来之后与原有代码互不干扰,不会影响到原有代码的功能;

具体的实现逻辑类图:

简单工厂类OperationFactory的唯一职责就是根据不同的运算符来创建对应的运算实例,

运算类(OperationAdd等)的唯一职责就是进行对应计算并返回结果;

《大话设计模式02》--简单工厂模式

对应的代码实现:

1,父类Operation提取运算类的共有属性(1,数字  2,数字需要进行哪种运算)

public abstract class Operation {
	protected static double NUM1;
	protected static double NUM2;
	public abstract double getResult();
}

2,具体的实现类(加减运算)

public class OperationAdd extends Operation {
	@Override
	public double getResult() {
		return NUM1 + NUM2;
	}
}
public class OperationSub extends Operation {
	@Override
	public double getResult() {
		return NUM1 - NUM2;
	}
}
public class OperationMul extends Operation {
	@Override
	public double getResult() {
		return NUM1 * NUM2;
	}
}
public class OperationDiv extends Operation {
	@Override
	public double getResult() {
		return NUM1 / NUM2;
	}
}

3, OperationFactory类

根据运算符号( + - * / )来实例化对应的运算类

public class OperationFactory {
	public static Operation ctrateOperation(String flag) {
		Operation operation = null;
		switch (flag) {
		case "+":
			operation = new OperationAdd();
			break;
		case "-":
			operation = new OperationSub();
			break;
		case "*":
			operation = new OperationMul();
			break;
		case "/":
			operation = new OperationDiv();
			break;
		default:
			break;
		}
		return operation;
	}
}

4, 测试类OperationTest

public static void main(String[] args) {
		String flag = "+";
		Operation operation = OperationFactory.ctrateOperation(flag);
		Operation.NUM1 = 10;
		Operation.NUM2 = 4;
		System.out.println(operation.getResult());
	}

通过NUM1, NUM1, flag三个参数来进行对应的运算测试, 求平方的话于此类似, 新增个类处理就可以了;

相关文章:

  • 2022-12-23
  • 2021-11-21
  • 2021-09-05
  • 2021-11-19
  • 2022-02-14
  • 2021-09-08
猜你喜欢
  • 2021-07-06
  • 2021-06-10
  • 2022-12-23
  • 2021-08-02
  • 2021-04-23
  • 2021-11-17
  • 2021-12-18
相关资源
相似解决方案