简单工厂模式
【摘要】 简单工厂模式
简单工厂模式
引入问题
用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
【普通代码】
这样的程序虽然解决了问题,但是不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。
说明:图片来源于大话设计模式,仅供学习使用。
【工厂模式代码】
题目中提到使用面向对象,那么面向对象的三大特征分别是封装、继承和多态。
我们可以尝试把计算类封装下,并且将不同的运算分来写,做到解耦,并且运用工厂模式。
架构如下图:
【Java】
运算类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: Operation
* @Description: 运算父类
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:10
*/
public class Operation {
private double numA;
private double numB;
public double getNumA() {
return numA;
}
public void setNumA(double numA) {
this.numA = numA;
}
public double getNumB() {
return numB;
}
public void setNumB(double numB) {
this.numB = numB;
}
public double getResult() throws Exception {
double res = 0;
return res;
}
}
加法类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: OperationAdd
* @Description: 加运算
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:13
*/
public class OperationAdd extends Operation{
@Override
public double getResult() {
return getNumA() + getNumB();
}
}
减法类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: OperationSub
* @Description: 减运算
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:18
*/
public class OperationSub extends Operation{
@Override
public double getResult() {
return getNumA() - getNumB();
}
}
乘法类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: OperationMul
* @Description: 乘运算
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:19
*/
public class OperationMul extends Operation{
@Override
public double getResult() {
return getNumA() * getNumB();
}
}
除法类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: OperationDiv
* @Description: 除运算
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:20
*/
public class OperationDiv extends Operation{
@Override
public double getResult() throws ArithmeticException {
if(getNumB()==0){
throw new ArithmeticException("除数不能为0!");
}
return getNumA() / getNumB();
}
}
简单工厂类
package keafmd.accumulate.designmode.factorymode;
/**
* Keafmd
*
* @ClassName: OperationFactory
* @Description: 计算工厂
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:23
*/
public class OperationFactory {
public static Operation createOperation(String operate) throws Exception {
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
default:
throw new Exception("输入运算符不合法!");
}
return operation;
}
}
客户端
package keafmd.accumulate.designmode.factorymode;
import java.util.Scanner;
/**
* Keafmd
*
* @ClassName: ComputingClient
* @Description: 计算客户端
* @author: 牛哄哄的柯南
* @date: 2022-06-22 19:29
*/
public class ComputingClient {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数:");
double a = sc.nextDouble();
double b = sc.nextDouble();
System.out.println("请输入运算符(+,-,*,/):");
String s = sc.next();
Operation operation = OperationFactory.createOperation(s);
operation.setNumA(a);
operation.setNumB(b);
System.out.println("运算结果为:" + operation.getResult());
}
}
效果
请输入两个数:
2
3
请输入运算符(+,-,*,/):
*
运算结果为:6.0
Process finished with exit code 0
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)