一、 问题描述
- 改进简单工厂模式,实现四则运算(加减乘除),采用工厂方法思想将需要创建的对象延迟到子类。
二、 完成如下题目要求
-
画出静态图
-
写出采用该设计模式的好处
由多个工厂类实现工厂接口,利用多态来创建不同的产品对象,避免了if-else判断
添加新的功能时,只需要添加相应的工厂,和实现类,符合开放封闭原则
- 编写代码
import java.util.Scanner;
/**
* 计算器
* @author Sakura
*
*/
public class Caculator {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
double numberA;
double numberB;
String operate="";
System.out.println("input number A");
numberA=scanner.nextDouble();
System.out.println("input the operate");
operate=scanner.next();
System.out.println("input number B");
numberB=scanner.nextDouble();
OperationFactory operationFactory = null;
switch(operate) {
case "+":
operationFactory=new AddFactory();
break;
case "-":
operationFactory=new SubFactory();
break;
case "*":
operationFactory=new MulFactory();
break;
case "/":
operationFactory=new DivFactory();
break;
default:
throw new ArithmeticException("error");
}
Operation operation=operationFactory.createOperation();
operation.setNumberA(numberA);
operation.setNumberB(numberB);
System.out.println("result:"+operation.getResult());
}
}
//抽象工厂接口
interface OperationFactory {
Operation createOperation();
}
//加法工厂
public class AddFactory implements OperationFactory{
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationAdd();
}
}
//减法工厂
public class SubFactory implements OperationFactory{
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationSub();
}
}
//乘法工厂
public class MulFactory implements OperationFactory {
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationMul();
}
}
//除法工厂
public class DivFactory implements OperationFactory {
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationDiv();
}
}
//运算类
public abstract class Operation {
private double numberA;
private double numberB;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public abstract double getResult();
}
//加法类
public class OperationAdd extends Operation {
@Override
public double getResult() {
double result=0;
result =this.getNumberA()+this.getNumberB();
return result;
}
}
//减法类
public class OperationSub extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
result=this.getNumberA()-this.getNumberB();
return result;
}
}
//乘法类
public class OperationMul extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
double result = 0;
result = this.getNumberA() * this.getNumberB();
return result;
}
}
//除法类
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = 0;
if(this.getNumberB()==0) throw new ArithmeticException("error");
result = this.getNumberA() / this.getNumberB();
return result;
}
}