C#設計模式(4)——抽象工廠模式

發表於2014-10-07

一、引言

在上一專題中介紹了工廠方法模式,工廠方法模式是為了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨著產品類的增加需要增加額外的程式碼),而工廠方法模式每個具體工廠類只完成單個例項的建立,所以它具有很好的可擴充套件性。但是在現實生活中,一個工廠只建立單個產品這樣的例子很少,因為現在的工廠都多元化了,一個工廠建立一系列的產品,如果我們要設計這樣的系統時,工廠方法模式顯然在這裡不適用,然後抽象工廠模式卻可以很好地解決一系列產品建立的問題,這是本專題所要介紹的內容。

二、抽象工廠詳細介紹

這裡首先以一個生活中抽象工廠的例子來實現一個抽象工廠,然後再給出抽象工廠的定義和UML圖來幫助大家更好地掌握抽象工廠模式,同時大家在理解的時候,可以對照抽象工廠生活中例子的實現和它的定義來加深抽象工廠的UML圖理解。

2.1 抽象工廠的具體實現

下面就以生活中 “絕味” 連鎖店的例子來實現一個抽象工廠模式。例如,絕味鴨脖想在江西南昌和上海開分店,但是由於當地人的口味不一樣,在南昌的所有絕味的東西會做的辣一點,而上海不喜歡吃辣的,所以上海的所有絕味的東西都不會做的像南昌的那樣辣,然而這點不同導致南昌絕味工廠和上海的絕味工廠生成所有絕味的產品都不同,也就是某個具體工廠需要負責一系列產品(指的是絕味所有食物)的建立工作,下面就具體看看如何使用抽象工廠模式來實現這種情況。

2.2 抽象工廠模式的定義和類圖

上面程式碼中都有詳細的註釋,這裡就不再解釋上面的程式碼了,下面就具體看看抽象工廠模式的定義吧(理解定義可以參考上面的實現來加深理解):

抽象工廠模式:提供一個建立產品的介面來負責建立相關或依賴的物件,而不具體明確指定具體類

抽象工廠允許客戶使用抽象的介面來建立一組相關產品,而不需要知道或關心實際生產出的具體產品是什麼。這樣客戶就可以從具體產品中被解耦。下面通過抽象工模式的類圖來了解各個類中之間的關係:

2.3 抽象工廠應對需求變更

看完上面抽象工廠的實現之後,如果 “絕味”公司又想在湖南開一家分店怎麼辦呢? 因為湖南人喜歡吃麻辣的,下面就具體看看應用了抽象工廠模式的系統是如何應對這種需求的。

此時,只需要新增三個類:一個是湖南具體工廠類,負責建立湖南口味的鴨脖和鴨架,另外兩個類是具有湖南口味的鴨脖類和鴨架類。從上面程式碼看出,抽象工廠對於系列產品的變化支援 “開放——封閉”原則(指的是要求系統對擴充套件開放,對修改封閉),擴充套件起來非常簡便,但是,抽象工廠對於新增新產品這種情況就不支援”開放——封閉 “原則,這也是抽象工廠的缺點所在,這點會在第四部分詳細介紹。

三、抽象工廠的分析

抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方。下面就具體看下抽象工廠的缺點(缺點其實在前面的介紹中以已經涉及了):

抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:

  • 一個系統不要求依賴產品類例項如何被建立、組合和表達的表達,這點也是所有工廠模式應用的前提。
  • 這個系統有多個系列產品,而系統中只消費其中某一系列產品
  • 系統要求提供一個產品類的庫,所有產品以同樣的介面出現,客戶端不需要依賴具體實現。

四、.NET中抽象工廠模式實現

抽象工廠模式在實際中的應用也是相當頻繁的,然而在我們.NET類庫中也存在應用抽象工廠模式的類,這個類就是System.Data.Common.DbProviderFactory,這個類位於System.Data.dll程式集中,該類扮演抽象工廠模式中抽象工廠的角色,我們可以用reflector反編譯工具檢視該類的實現:

DbProviderFactory類是一個抽象工廠類,該類提供了建立資料庫連線時所需要的物件集合的介面,實際建立的工作在其子類工廠中進行,微軟使用的是SQL Server資料庫,因此提供了連線SQL Server資料的具體工廠實現,具體程式碼可以用反編譯工具檢視,具體程式碼如下:

因為微軟只給出了連線SQL Server的具體工廠的實現,我們也可以自定義連線Oracle、MySql的具體工廠的實現。

五、總結

到這裡,抽象工廠模式的介紹就結束,在下一專題就將為大家介紹建造模式。

程式原始碼:抽象工廠模式實現

相關文章