简单工厂模式
对于容易变化的地方,应该考虑用一个单独的类做创造的过程,这就是工厂。
使用Java语言实现一个计算器控制台程序,要求输入两个操作数与一个操作符,得到运算结果。
通过封装、继承、多态把程序的耦合度降低,使用面向对象的编程方式从而使得代码拥有易维护,易拓展,易复用的优点。
分离加减乘除运算,可以达到修改其中一个不影响另外几个、增加运算算法也不影响其他代码的目的。
/**
* Operation运算类
*/
public class Operation {
private double Number_1, Number_2; //声明进行运算的两个数字
public void setNumber_1(double number_1) {
Number_1 = number_1;
}
public double getNumber_1() {
return Number_1;
}
public void setNumber_2(double number_2) {
Number_2 = number_2;
}
public double getNumber_2() {
return Number_2;
}
public double getResult() {
double result = 0;
return result;
}
}
/**
* 加减乘除类
*/
class OperationAdd extends Operation {
@Override
public double getResult() {
double result = 0;
result = (getNumber_1() + getNumber_2());
return result;
}
}
class OpeartionSub extends Operation {
@Override
public double getResult() {
double result = 0;
result = (getNumber_1() - getNumber_2());
return result;
}
}
class OpeartionMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = (getNumber_1() * getNumber_2());
return result;
}
}
class OpeartionDiv extends Operation {
@Override
public double getResult() {
double result = 0;
try {
result = (getNumber_1() / getNumber_2());
} catch (Exception e) {
System.out.println(e);
}
return result;
}
}
首先是Operation类,拥有两个属性Number_1、Number_2,主要用于计算器的前后操作数,与一个虚方法getResult(),用于得到结果。加减乘除类继承于Operation类,重写了getResult()方法,这样如果需要修改任何一个算法,就不需要提供其他算法的代码了。现在就是如何去实例化对象的问题,也就是说,到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。
/**
* 简单运算工厂类
*/
public class OperationFactory {
public static Operation getResult(String operater) {
Operation operation = null;
switch (operater) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OpeartionSub();
break;
case "*":
operation = new OpeartionMul();
break;
case "/":
operation = new OpeartionDiv();
break;
default:
break;
}
return operation;
}
}
这样只需要输入操作符,工厂就会实例化出合适的对象,通过多态,返回父类的方法实现计算器的结果。
import java.util.Scanner;
/**
* 客户端代码
*/
public class Client {
public static void main(String[] args) {
Operation operation;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入第一个操作数:");
double number_1 = scanner.nextDouble();
System.out.print("请输入操作符:");
String operater = scanner.next();
System.out.print("请输入第二个操作数:");
double number_2 = scanner.nextDouble();
try {
operation = OperationFactory.getResult(operater);
operation.setNumber_1(number_1);
operation.setNumber_2(number_2);
double result = operation.getResult();
System.out.println("返回值:" + result);
} catch (Exception e) {
System.out.println(e);
}
}
}
如果有一天我们需要更改加减乘除的算法,我们只需要更改相应的类就行了,如果需要增加各种复杂运算,比如平方根、立方根、自然对数、正弦余弦等,我们需要增加相应的运算子类,并修改运算类工厂,在switch中增加分支。