# 背景
簡單工廠模式是很多程式員學習的第一個設計模式,因為其不但原理簡單而且易于上手,在日常作業的代碼中也常有體現,今天分享一個基于實作“加”、“減”、“乘”、“除”計算器的需求基于簡單工廠模式來實作,
# 錯誤示范
在學習簡單工廠模式之前,遇到這種需求我是這樣實作的:
public static Double Calculator(Double num1, Double num2, String symbol) throws Exception { Double result = 0.0D; if (symbol == null || num1 == null || num2 == null) { return result; } switch (symbol) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": if (num2 == 0) { throw new Exception("使用除法的時候分母不能為0"); } result = num1 / num2; break; default:{} } return result; }
簡單來說是船艦一個方法,然后通過switch case 一個一個的去判斷,然后對比中的進行處理,后續如果有其他判斷的話,就繼續在下面在增加case判斷,那么這段代碼實作了需求了,是實作了,但是這段代碼是優秀的嗎?不是,為什么呢?例如現在客戶需求增加一個平方演算法,我們在case中增加這個演算法,卻需要加減乘除的運算都得來參與編譯,在這個代碼的迭代程序中,如果不小心對原有代碼進行了誤操作,會造成很糟糕的結果,尤其是這個誤操作有可能還不會報錯……所以我們應該把加減乘除等運算進行分離,修改其中一個不會影響另外的幾個,增加平方演算法也不影響其他代碼,
宣告父類
@Data public abstract class Operation { private double num1; private double num2; protected abstract double getResult(); }
創建多個計算類用于繼承父類并重寫getResult方法,這里我分別創建了加減乘除四個類來繼承Operation類,并重寫getResult()方法
class OperationAdd extends Operation{ @Override protected double getResult() { return getNum1() + getNum2(); } } class OperationSub extends Operation { @Override protected double getResult() { return getNum1() - getNum2(); } } class OperationMul extends Operation { @Override protected double getResult() { return getNum1() * getNum2(); } } class OperationDiv extends Operation { @Override protected double getResult() { return getNum1() / getNum2(); } }
此時,我們只需要簡單的寫一個工程方法就可以實作業務要求了,這里只是實體代碼,很多細節判斷沒有加,如果是在生成環境中,首先入參肯定要校驗是否為null,如果為null會報NPE,上面除法運算類中,應該對分母進行判斷,是否為0等等……
class OperationFactory { public static Operation createOperation(String operate) { Operation operation; switch (operate) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; default:{ operation = new OperationAdd(); } } return operation; } }
測驗main方法
public static void main(String[] args) { Operation operation = OperationFactory.createOperation("*"); operation.setNum1(11d); operation.setNum2(1.2); System.out.println(operation.getResult()); }
回傳結果:
13.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35333.html
標籤:設計模式
上一篇:設計模式之單例模式C#實作
