# 背景 簡單工廠模式是很多程序員學(xué)習(xí)的第一個設(shè)計(jì)模式,因?yàn)槠洳坏砗唵味乙子谏鲜?,在日常工作的代碼中也常有體現(xiàn)。今天分享一個基于實(shí)現(xiàn)“加”、“減”、“乘”、“除”計(jì)算器的需求基于簡單工廠模式來實(shí)現(xiàn)。 # 錯誤示范 在學(xué)習(xí)簡單工廠模式之前,遇到這種需求我是這樣實(shí)現(xiàn)的: 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 一個一個的去判斷,然后對比中的進(jìn)行處理,后續(xù)如果有其他判斷的話,就繼續(xù)在下面在增加case判斷。那么這段代碼實(shí)現(xiàn)了需求了,是實(shí)現(xiàn)了,但是這段代碼是優(yōu)秀的嗎?不是。為什么呢?例如現(xiàn)在客戶需求增加一個平方算法,我們在case中增加這個算法,卻需要加減乘除的運(yùn)算都得來參與編譯,在這個代碼的迭代過程中,如果不小心對原有代碼進(jìn)行了誤操作,會造成很糟糕的結(jié)果,尤其是這個誤操作有可能還不會報錯……所以我們應(yīng)該把加減乘除等運(yùn)算進(jìn)行分離,修改其中一個不會影響另外的幾個,增加平方算法也不影響其他代碼。 聲明父類 @Data public abstract class Operation { private double num1; private double num2; protected abstract double getResult(); } 創(chuàng)建多個計(jì)算類用于繼承父類并重寫getResult方法,這里我分別創(chuàng)建了加減乘除四個類來繼承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(); } } 此時,我們只需要簡單的寫一個工程方法就可以實(shí)現(xiàn)業(yè)務(wù)要求了。這里只是實(shí)例代碼,很多細(xì)節(jié)判斷沒有加,如果是在生成環(huán)境中,首先入?yún)⒖隙ㄒr?yàn)是否為null,如果為null會報NPE,上面除法運(yùn)算類中,應(yīng)該對分母進(jìn)行判斷,是否為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()); } 返回結(jié)果: 13.2
|
|