设计模式之简单工厂模式_菩提树下吹口哨的博客-爱代码爱编程
定义一个加减乘除计算机来简单梳理简单工厂模式
常规方式实现
定义函数
private static void func1(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字A:");
String strA = scanner.nextLine();
System.out.println("请输入运算符(+、-、*、/):");
String strOper = scanner.nextLine();
System.out.println("请输入数字B:");
String strB = scanner.nextLine();
String strResult = "";
try{
switch (strOper){
case "+":
strResult = Integer.valueOf(strA)+Integer.valueOf(strB)+"";
break;
case "-":
strResult = Integer.valueOf(strA)-Integer.valueOf(strB)+"";
break;
case "*":
strResult = Integer.valueOf(strA)*Integer.valueOf(strB)+"";
break;
case "/":
if("0".equals(strB)){
strResult = "除数不能为0!";
}else{
strResult = Integer.valueOf(strA)/Integer.valueOf(strB)+"";
}
break;
}
System.out.println("运算结果是:"+strResult);
}catch (Exception e){
System.out.println("运算出错,异常信息:"+e.getMessage());
}
}
执行结果
请输入数字A:
10
请输入运算符(+、-、*、/):
+
请输入数字B:
15
运算结果是:25.0
分析
常规方法,写法固定简单,但硬代码实现,无法方便扩展,比如增加一个平方运算法则,就要完全重写逻辑。
简单工厂模式实现
实现源码
定义运算基类Operation
public class Operation {
private double numA = 0;
private double numB = 0;
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 result = 0;
return result;
}
}
定义运算基类Operation的派生类(加减乘除)
public class OperationAdd extends Operation{
@Override
public double getResult() {
double result = 0;
result = getNumA()+getNumB();
return result;
}
}
public class OperationSub extends Operation{
@Override
public double getResult() {
double result = 0;
result = getNumA()-getNumB();
return result;
}
}
public class OperationMul extends Operation{
@Override
public double getResult() {
double result = 0;
result = getNumA()*getNumB();
return result;
}
}
public class OperationDiv extends Operation{
@Override
public double getResult() throws Exception {
double result = 0;
if(getNumB() == 0){
throw new Exception("除数不能为0");
}
result = getNumA()/getNumB();
return result;
}
}
定义工厂类,用于根据运算符生成对应的运算类
public class OperationFactory {
public static Operation createOperate(String operate){
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;
}
return operation;
}
}
业务方法中,通过工厂类和运算符,来生成对应的运算符类计算得到最终结果
public static void func2(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字A:");
String strA = scanner.nextLine();
System.out.println("请输入运算符(+、-、*、/):");
String strOper = scanner.nextLine();
System.out.println("请输入数字B:");
String strB = scanner.nextLine();
String strResult = "";
try{
Operation operation = OperationFactory.createOperate(strOper);
operation.setNumA(Double.valueOf(strA));
operation.setNumB(Double.valueOf(strB));
strResult = operation.getResult()+"";
System.out.println("运算结果是:"+strResult);
}catch (Exception e){
System.out.println("运算出错,异常信息:"+e.getMessage());
}
}
执行结果
请输入数字A:
10
请输入运算符(+、-、*、/):
+
请输入数字B:
15
运算结果是:25.0
分析
通过运算符让工厂类来自动识别生成对应的计算方法,方便扩展。
比如增加一个平方运算法则,只需要增加一个对应的开平方方法类,增加相应的运算符识别逻辑就行了,不影响原来的加减乘除的核心运算逻辑。
联系
个人主页
https://xmlrambo.github.io/
公众号
xiaomingxiaola
QQ群
58726094