大話設計模式之(一)工廠模式
(大話設計模式)
最近在研究大話設計模式,正好終結一下,以備自己後續檢視。
書中對設計模式分類有28種,今天終結下最為常見的模式,工廠模式。工廠模式有三種:簡單工廠模式,工廠方法模式,抽象工廠模式。
下面說說這三種模式的差異,並一一舉以書中的例子加以說明。
簡單工廠模式:用一個單獨的類來做建立例項的過程,就是一個工廠,以此來增加設計的可擴充套件性,同時要求設計具有鬆耦合性質。下面以計算器為例子來說明。
原生的實現方式我們可以用一個操作類,這裡class名為operation,用多個case來實現多種的操作方式,如:
public static double getResult(double numberA,double numberB,String operation){ double result=0d; switch(operation){ case "+": result=numberA+numberB; break; case "-": result=numberA-numberB; break; case "*": result=numberA*numberB; break; case "/": result=numberA/numberB; break; } return result; }
但這種方式的編寫有一個明顯的弊端,如果現在需要擴充套件運算,如開根號運算,就很麻煩。這時候簡單工廠模式就起到作用。定義一個operation 父類
public class Operation { private double numberA; private double numberb; 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 GetResut(){ double result=0; return result; } }
子類為各運算方法重寫父類getResult方法,如
public class AddOperation extends Operation{
public double GetResut(){
double result=0;
result=getNumberA()+getNumberb();
return result;
}
}
再定義一個工廠類,根據運算子號選擇對應的子類執行,這樣對於開根號運算就可以利用到加減乘除運算,對於新增的執行方法只需增加對應的子類,並在工廠中做相應的增加修改即可。
大家估計已經注意到簡單工廠模式有一個弊端,那就是需要在客戶端知道我要用到的是哪一種執行,並且每增加一種執行就需要在工廠中case一種執行符。
工廠模式很好的解決了這個問題,依然以上面的例子為例,工廠模式將例項化到其子類。定義一個工廠介面
public interface IFactory {
Operation CreateOperaton();
}
將例項化建立增加操作為例如下:
public class AddFactory implements IFactory{
@Override
public Operation CreateOperaton() {
return new AddOperation();
}
}
因此客戶端的執行只需要例項化對應的運算,即可。需要擴充套件其他執行無需再去修改工廠中的運算程式碼,只需要新建執行類,在實現工廠模式的,即可,完美的滿足開放-封閉的設計原則。
最後,來說說抽象工廠模式,所謂的抽象是指簡單工廠模式中的case條件我們並不事先確定,但裡面的operaton執行基本一致,那我們可以用反射配置的方式來獲取case的內容,從而根據反射的獲取的內容建立到對應的operation操作,值得說明的是所有用簡單工廠模式case得到的operation都可以用反射配置來實現。