客户要求:实现一个计算器
糙汉子这样实现:
import java.util.Scanner;
/**
* @Author:
* @Description:
* @Date:Create in 2018/4/16 19:45
* @Modify By:
*/
public class XiewtTest {
public static void main(String[] args) {
Scanner scaner=new Scanner(System.in); //参数对象是系统进来的流
System.out.println("请输入数据1:");
String strNum1=scaner.next(); //next()方法用来接收控制台输入的字符串
System.out.println("请输入数据2:");
String strNum2=scaner.next(); //next()方法用来接收控制台输入的字符串
System.out.println("请输入操作符:");
String strOperate=scaner.next(); //next()方法用来接收控制台输入的字符串
String strResult = "";
switch(strOperate) {
case "+" :
strResult = String.valueOf(Double.parseDouble(strNum1) + Double.parseDouble(strNum2));
break;
case "-" :
strResult = String.valueOf(Double.parseDouble(strNum1) - Double.parseDouble(strNum2));
break;
case "*" :
strResult = String.valueOf(Double.parseDouble(strNum1) - Double.parseDouble(strNum2));
break;
case "/" :
if (Double.parseDouble(strNum2) != 0) {
strResult = String.valueOf(Double.parseDouble(strNum1) / Double.parseDouble(strNum2));
} else {
strResult = "除数不能为0";
}
break;
}
System.out.println(strResult);
}
}
如果客户一言不合要加需求:我需要能开根号的计算器。
那我们就需要对该程序进行较大的改动,如果客户不断有需求,我们就要疯掉了,作为一个面向对象的程序员,我们需要考虑通过封装、继承、多态来降低程序的耦合度。于是面向对象的计算器出现了:
class Operation {
private double num1 = 0;
private double num2 = 0;
public double getNum1() {
return num1;
}
public void setNum1(double num1) {
this.num1 = num1;
}
public double getNum2() {
return num2;
}
public void setNum2(double num2) {
this.num2 = num2;
}
public double getResult() {
double result = 0;
return result;
}
}
public class OperationAdd extends Operation {
public double getResult() {
double result = 0;
result = num1 + num2;
return result;
}
}
public class OperationSub extends Operation {
public double getResult() {
double result = 0;
result = num1 - num2;
return result;
}
}
public class OperationFactory {
public static Operation createOperate(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
如果还需要实现其他计算方式,只需要新增计算方式的类,在工厂类中添加对参数判断的方法就搞定了,比第一种方式简洁很多,而且还不影响之前的业务。这种方式就是简单工厂模式。简单工厂模式:又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式包含如下角色:
- Factory:工厂角色
- 工厂角色负责实现创建所有实例的内部逻辑
- Operate:抽象运算角色
- 抽象运算角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- OperationAd:具体运算角色
- 具体运算角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。