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

本文介绍了一种使用设计模式改进基本算术运算的方法。从简单的switch-case结构开始,逐步过渡到工厂模式,通过创建独立的类来处理加、减、乘、除等运算,实现了代码的模块化和易于扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 场景需求:

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

一, 最初的实现

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等)的唯一职责就是进行对应计算并返回结果;

对应的代码实现:

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三个参数来进行对应的运算测试, 求平方的话于此类似, 新增个类处理就可以了;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值