运用一个单独的 OperationFactory 类,来做创造 Operation 运算符 实例的过程,便是简单工厂模式。
其中加减乘除运算符都是运用了面向对象的继承特性,需要添加开方或者sin函数运算只需要多继承一个而不需要改动原有的代码,更改其中一个只需在本身的类里更改。
封装特性体现在运算类与客户端的界面显示分离
也可用接口实现,更为灵活,这里主要体现简单工厂模式的用法
//运算符基类
public class Operation {
protected double _numA;
protected double _numB;
protected double _result;
public double get_numA() {
return _numA;
}
public void set_numA(double _numA) {
this._numA = _numA;
}
public double get_numB() {
return _numB;
}
public void set_numB(double _numB) {
this._numB = _numB;
}
public double GetResult() throws Exception {
return _result;
}
}
//运算符子类,重写运算方法
public class OperationAdd extends Operation{
@Override
public double GetResult() {
return this._numA+this._numB;
}
}
public class OperationSub extends Operation{
@Override
public double GetResult() {
return this._numA-this._numB;
}
}
public class OperationMul extends Operation{
@Override
public double GetResult() {
return this._numA*this._numB;
}
}
public class OperationDiv extends Operation {
@Override
public double GetResult() throws Exception {
if (this._numB == 0) {
throw new Exception("除数不能为0");
}
return this._numA / this._numB;
}
}
简单工厂模式
//简单工厂模式,用于创造运算符实例
public class OperationFactory {
public static Operation CreateOperation(String operation) {
Operation oper = null;
switch (operation) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
//界面和运算业务分离,封装特性
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A");
String numA = sc.next();
System.out.println("请输入运算符 + - * /");
String operation = sc.next();
System.out.println("请输入数字B");
String numB = sc.next();
Operation oper = OperationFactory.CreateOperation(operation);
oper.set_numA(Double.valueOf(numA));
oper.set_numB(Double.valueOf(numB));
System.out.printf("结果是 %f", oper.GetResult());
} catch (Exception e) {
e.printStackTrace();
}
}
}