大話設計模式之簡單工廠模式(Java版)
阿新 • • 發佈:2018-11-15
大話設計模式——第一章(簡單工廠模式)
題目:請用C++、Java、C#或VB.NET任意一種面嚮物件語言實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。
import java.io.Console; import java.util.Scanner; /** * @author zdy * @create 2018-11-14 22:46 */ public class Program { public static void main(String args[]){ try{ Scanner scanner = new Scanner(System.in); System.out.println("請輸入數字A:"); String numberA = scanner.next(); System.out.println("請選擇運算子號(+、-、*、/):"); String operateSign = scanner.next(); System.out.println("請輸入數字B:"); String numberB = scanner.next(); String result = ""; switch (operateSign){ case "+": result = new Double((Double.parseDouble(numberA))+(Double.parseDouble(numberB))).toString(); break; case "-": result = new Double((Double.parseDouble(numberA))-(Double.parseDouble(numberB))).toString(); break; case "*": result = new Double((Double.parseDouble(numberA))*(Double.parseDouble(numberB))).toString(); break; case "/": if(numberB!="0") { result = new Double((Double.parseDouble(numberA))/(Double.parseDouble(numberB))).toString(); }else{ result = "除數不可以為0"; } break; default: System.out.println("你的輸入有誤,請重新輸入"); return; } System.out.println("結果是:"+result); } catch(Exception e){ System.out.print("您的輸入有誤,請根據提示輸入!"); e.printStackTrace(); } } }
上面的做法雖然實現計算器是沒有問題但是這樣的程式碼並不符合出題人的意思。因為出題人是要求用面向物件的思想去實現程式碼的,但是上面的程式碼則是面向過程。
這樣的程式不容易維護和擴充套件,更不容易複用。因此我們需要使用面向物件的思想(封裝,繼承,多型)去實現容易維護,容易擴充套件和複用的計算器程式,程式碼如下:
/** * @author zdy * @create 2018-11-14 23:15 * 定義一個操作介面 */ public class Operation { private double numberA; private double numberB; private double result; 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 double getResult() throws Exception { return result; } public void setResult(double result){ this.result = result; } }
/**
* @author zdy
* @create 2018-11-14 23:18
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getNumberA()+getNumberB();
}
}
/** * @author zdy * @create 2018-11-14 23:26 */ public class OperationSub extends Operation { @Override public double getResult() { return getNumberA()-getNumberB(); } }
/**
* @author zdy
* @create 2018-11-14 23:27
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
return getNumberA()*getNumberB();
}
}
/**
* @author zdy
* @create 2018-11-14 23:27
*/
public class OperationDiv extends Operation {
@Override
public double getResult() throws Exception {
if(getNumberB()==0)
{
throw new Exception("除數不能為0");
}else{
return getNumberA()/getNumberB();
}
}
}
/**
* @author zdy
* @create 2018-11-14 23:31
* 簡單工廠模式,工廠就是考慮用一個單獨的類來做這個創造例項的過程
*/
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;
}
}
import javax.xml.transform.Result;
/**
* @author zdy
* @create 2018-11-14 23:35
* 測試執行
*/
public class CalculatorTest {
public static void main(String args[])
{
Operation operation = OperationFactory.createOperate("+");
operation.setNumberA(1);
System.out.println(operation.getNumberA());
operation.setNumberB(2);
System.out.println(operation.getNumberB());
try {
System.out.println(operation.getResult());
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述的程式碼從整體上實現了面向物件的三個特性(繼承,封裝,多型),以及簡單工廠模式。
部分內容源自——大話設計模式