# 背景 程序員
簡單工廠模式是不少程序員學習的第一個設計模式,由於其不但原理簡單並且易於上手,在平常工做的代碼中也常有體現。今天分享一個基於實現「加」、「減」、「乘」、「除」計算器的需求基於簡單工廠模式來實現。算法
# 錯誤示範設計模式
在學習簡單工廠模式以前,遇到這種需求我是這樣實現的:ide
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()方法spa
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方法code
public static void main(String[] args) { Operation operation = OperationFactory.createOperation("*"); operation.setNum1(11d); operation.setNum2(1.2); System.out.println(operation.getResult()); }
返回結果:blog
13.2