說到設計模式。自然少不了簡單工廠模式。工廠方法和抽象工廠這三姐妹。
它們之間可謂是各有所長,術業專攻啊!這篇部落格來簡單的梳理一下三者之間的關係。
那麼工廠又是什麼意思呢?結合三者的特點,我覺得能夠這樣理解:工廠能夠看做一個特殊的類,在這個類中專門負責生產一系列產品(物件)的一個集合就能夠成為工廠。
那麼上述三種模式之間到底是如何的關係呢?各自又有什麼優缺點呢?
一、簡單工廠模式 VS 工廠方法模式
1、先來看一個簡單工廠的一段程式碼:
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 ;
}
通過程式碼我們能夠看出。在簡單工廠中,能夠講多種須要例項化的物件在一個分支結構中一次性的完畢。詳細的選擇要留給client去做。
比如:
oper= OperationFactory.createOperate("+");
那我們繼續擴充套件。當我們想要在程式中新增一種演算法符號,這時,我們必須對簡單工廠中的分支語句進行改動。這樣事實上就違背了設計模式中的開放——封閉原則。為了避免對內改動。我們再來看一下工廠方法模式。
2、工廠方法模式
核心思想:建立一個介面,子類去實現這個介面。同一時候,依據子類來決定到底要例項化哪個物件。
看一段程式碼:
interface IFactory //定義一個介面
{//非靜態 Operation CreateOperation();
}
class AddFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();//子類j決定詳細對哪個子類進行例項化
}
}
class SubFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
其餘程式碼類似略。
通過工廠方法模式。我們能夠發現,假設如今再新增一個運算子的話。我們僅僅須要額外新增一個運算子子類和實現介面的子類就好了,而不用去對已經寫好的類進行改動了。可見與簡單工廠相比,工廠方法模式遵循了開放——封閉原則:即對外擴充套件,對內封閉。
另一個小小的差別:在簡單工廠中用static宣告方法為靜態方法,而工廠方法中卻未用到靜態方法,原因是:在簡單工廠中因為不須要子類進行繼承,所以使用靜態方法能夠避免例項化。能夠用類來直接呼叫方法。而在工廠方法中因為存在繼承關係,所以不能使用靜態方法
二、 工廠方法 VS 抽象工廠
我覺得事實上這二者本屬於一類。
最基本的差別是:
工廠方法:涉及到的是僅僅需定義一個產品類和一個物件介面。能夠派生出多個子類。
而抽象工廠:定義一系列即多個產品類和多個物件介面。分別派生出多個子類。
這裡,不多做解釋。
三、簡單工廠 VS 抽象工廠
在抽象工廠中能夠定義多個產品類和物件介面,但是,假設我們想要在此基礎上多加一個產品,那麼此時。須要新增的類就會非常多。同一時候還須要去更改涉及到的各個工廠。這事實上無形中就已經新增了程式碼的維護量。
對於程式設計來說又是一個不好的兆頭。那麼有什麼辦法能夠改進它呢?事實上,簡單工廠能夠彌補這個缺陷。
舉一個大話設計模式中的樣例:建立資料庫:SqlServer和Access兩類,同一時候包括IUser和IDepartment兩張表假設用抽象工廠方法來設計如圖:
如圖,假設此時,我們想要在新增一個專案表Project時。必須新增專案介面。SqlserverProject和AccessProject的類同一時候。還必須改動企業兩個工廠,在兩個工廠中新增例項化Project的項,造成程式碼維護量新增。
此時。假設我們把IFactory抽象工廠用一個DataAccess來取代。同一時候新增一個字串變數,利用簡單工廠來例項化字串變數中所指定的資料庫。
簡單工廠方法的類圖例如以下:
當然,我們能夠看出來。利用簡單工廠方法。儘管修改相對少了。可是仍然違背了開放——封閉原則。由於在新增其它表時。仍須要修改DataAccess中的分支語句,所以。對於簡單工廠和抽象工廠方法二者應該酌情使用。二者都有自己的長處和缺點,我們應該依據詳細情況詳細分析。
當然為了進一步改進。大話設計模式中還提到了利用“反射”和配置檔案的技術。總之。設計模式是一門藝術,僅僅有更好。沒有最好!