上篇文章我們介紹了工廠方法模式,已經充分的體會到了工廠模式的優越性, 但是如果產品再進行細化的時候我們就該用到了抽象工廠模式。這節我們將接觸到產品族等概念。閒話少說,馬上步入正題吧。
定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。
簡單工廠:工廠可以創建同一系列的產品,產品的接口一致,但工廠就要根據參數進行判斷到底創建哪種產品
賣早飯的張婆婆:可以做茶葉蛋,包子,稀飯
工廠方法:可以有多種工廠,工廠有共同的接口,一個工廠只能產生一種產品,比起簡單工廠,工廠方法就不需要判斷,耦合度低了不少
劉老板:只賣包子的包子鋪,只賣稀飯的稀飯莊
抽象工廠:可以產生多個系列的產品,有2個維度的產品
KFC老板:可樂系列產品、漢堡系列產品,每種系列產品又分大,中,小三種。
如果這樣來看應該很容易就能區分他們之間的關系了。
為了方便引進抽象工廠模式,引進一個新概念:產品族(Product Family)。所謂產品族,是指位於不同產品等級結構,功能相關聯的產品組成的家族。如圖:
圖中一共有四個產品族,分布於三個不同的產品等級結構中。只要指明一個產品所處的產品族以及它所屬的等級結構,就可以唯一的確定這個產品。
所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。
可能大家還是看不太懂舉個例子吧:比如AMD的主板、芯片組、CPU組成一個家族,Intel的主板、芯片組、CPU組成一個家族。而這兩個家族都來自於三個產品等級:主板、芯片組、CPU。一個等級結構是由相同的結構的產品組成,示意圖如下:
vc/yu6631qOs0M6zydK7uPa2/s6stcTX+LHqz7Who7rh1uGx7cq+svrGt7XEtci8tr3hubmjrNfd1uGx7cq+svrGt9flo6zJz828ubLT0MG9uPay+sa31+WjrLfWsrzT2sj9uPayu82stcSy+sa3tci8tr3hubnW0KGj1rvSqta4w/fSu7j2svrGt8v5tKa1xLL6xrfX5dLUvLDL/Mv5yvS1xLXIvLa94bm5o6y+zb/J0tTOqNK7tcTIt7ao1eK49rL6xrehozwvcD4KPHA+yc/D5sv5uPiz9rXEyP249rK7zay1xLXIvLa94bm5vt/T0Ma90NC1xL3hubmho9LytMujrMjnufuyydPDuaSzp7e9t6jEo8q9o6y+zcrGsdjSqsq508PI/bj2tsDBorXEuaSzp7XIvLa94bm5wLS21Li21eLI/bj2svrGt7XIvLa94bm5oaPTydPa1eLI/bj2svrGt7XIvLa94bm5tcTP4MvG0NSjrLvhtbzWwsj9uPbGvdDQtcS5pLOntci8tr3hubmho8vm18Wy+sa3tci8tr3hubm1xMr9xL+1xNT2vNOjrLmks6e3vbeoxKPKvcv5uPiz9rXEuaSzp7XIvLa94bm5tcTK/cS/0rK74cvm1q7U9rzToaPI58/CzbyjujwvcD4KPHA+PGJyIC8+CjxpbWcgc3JjPQ=="alt=" />
那麼,是否可以使用同一個工廠等級結構來對付這些相同或者極為相似的產品等級結構呢?當然可以的,而且這就是抽象工廠模式的好處。同一個工廠等級結構負責三個不同產品等級結構中的產品對象的創建。
可以看出,一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有對象。顯然,這時候抽象工廠模式比簡單工廠模式、工廠方法模式更有效率。對應於每一個產品族都有一個具體工廠。而每一個具體工廠負責創建屬於同一個產品族,但是分屬於不同等級結構的產品。
(1)分離接口和實餡喎?/kf/yidong/wp/" target="_blank" class="keylink">WPC9wPgo8cD4mbmJzcDs8L3A+CjxwPr/Nu6e2y8q508Oz6c/zuaSzp8C0tLS9qNDo0qq1xLbUz/OjrLb4v827p7bLuPmxvr7NsrvWqrXAvt/M5bXEyrXP1srHy62jrL/Nu6e2y9a7ysfD5s/ysvrGt7XEvdO/2rHgs8y2+NLRoaPSsr7NysfLtaOsv827p7bLtNO+38zltcSy+sa3yrXP1tbQveLx7qGjPC9wPgo8cD6jqDKjqcq5x9C7u7L6xrfX5bHktcPI3dLXPC9wPgo8cD7S8s6q0ru49r7fzOW1xLmks6fKtc/WtPqx7bXEysfSu7j2svrGt9flo6yxyMjnyc/D5sD919O1xLTTSW50ZWzPtcHQtb1BTUTPtcHQ1rvQ6NKqx9C7u9K7z8K+38zluaSzp6GjPC9wPgo8aDI+PHN0cm9uZz4yLjUgs+nP87mks6fEo8q9tcTIsbXjPC9zdHJvbmc+PC9oMj4KPHA+srvMq8jd0tfAqdW50MK1xLL6xrejusjnufvQ6NKquPjV+7j2svrGt9flzO2809K7uPbQwrXEsvrGt6OsxMfDtL7N0OjSqtDeuMSz6c/zuaSzp6Os1eLR+b7Nu+G1vNbC0N64xMv509C1xLmks6fKtc/WwOChozwvcD4KPGgyPjIuNiCz6c/zuaSzp73hubk8L2gyPgo8cD4mbmJzcDs8L3A+CjxwPrPpz/O5pLOnxKPKvcrHttTP87XEtLS9qMSjyr2jrMv8yse5pLOnt723qMSjyr21xL340ruyvc3GueOhozwvcD4KPHA+oaGhobzZyejSu7j219PPtc2z0OjSqtK70Kmy+sa3ttTP86OstvjV4tCpsvrGt9PWyvTT2tK7uPbS1MnPtcSy+sa3tci8tr3hubmho8THw7TOqsHLvavP+7fR1eLQqbL6xre21M/ztcTU8MjOus20tL2o1eLQqbL6xre21M/ztcTU8MjOt9a47r+qwLSjrL/J0tTS/b34s+nP87mks6fEo8q9oaPV4tH5tcS7sKOsz/u30bL6xre1xNK7t72yu9Do0qrWsb3Tss7T67L6xre1xLS0vai5pNf3o6y2+Na70OjSqs/y0ru49rmr08O1xLmks6e907/ax+vH88v50OjSqrXEsvrGt6GjPC9wPgo8cD6hoaGhzai5/cq508Oz6c/zuaSzp8Sjyr2jrL/J0tS0psDtvt/T0M/gzayjqLvy1d/P4MvGo6m1yLy2veG5udbQtcS24Lj2svrGt9fl1tC1xLL6xre21M/ztcS0tL2ozsrM4qGjyOfPws28y/nKvqO6PC9wPgo8YnIgLz4KPGltZyBzcmM9"alt=" />
根據產品角色的結構圖,就不難給出工廠角色的結構設計圖。
可以看出,每一個工廠角色都有兩個工廠方法,分別負責創建分屬不同產品等級結構的產品對象。
抽象工廠的功能是為一系列相關對象或相互依賴的對象創建一個接口。一定要注意,這個接口內的方法不是任意堆砌的,而是一系列相關或相互依賴的方法。比如上面例子中的主板和CPU,都是為了組裝一台電腦的相關對象。不同的裝機方案,代表一種具體的電腦系列。
由於抽象工廠定義的一系列對象通常是相關或相互依賴的,這些產品對象就構成了一個產品族,也就是抽象工廠定義了一個產品族。
這就帶來非常大的靈活性,切換產品族的時候,只要提供不同的抽象工廠實現就可以了,也就是說現在是以一個產品族作為一個整體被切換。
(1)一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
(2)這個系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
(3)同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。(比如:Intel主板必須使用Intel CPU、Intel芯片組)
(4)系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。
2.8 實例代碼下面我們來看看上面這個實例的代碼:
CPU父類:
#import/*! * CPU父類 * * @since V1.0 */ @interface CpuBase : NSObject @property int pins;//針腳數 -(void)calculate; @end
Intel的CPU子類:
#import CpuBase.h /*! * Intel的CPU子類 * * @since V1.0 */ @interface IntelCPU : CpuBase @end
MainBoard父類:
#import/*! * MainBoard父類 * * @since V1.0 */ @interface MainBoardBase : NSObject @property int cpuHoles;//CPU插槽數 -(void)installCpuHoles;//統計CPU插槽數 @end
Intel的主板子類:
#import MainBoardBase.h /*! * Intel的主板子類 * * @since V1.0 */ @interface IntelMainBoard : MainBoardBase @end
工廠基類:
#import#import CpuBase.h #import MainBoardBase.h /*! * 工廠基類 * * @since V1.0 */ @interface FactoryBase : NSObject /*! * 創建CPU * @return 返回CPU實例 * * @since V1.0 */ -(CpuBase*)createCpu; /*! * 創建主板 * * @return 返回主板實例 * * @since V1.0 */ -(MainBoardBase*)createMainBoard; @end
Intel工廠子類:
#import FactoryBase.h #import IntelCPU.h #import IntelMainBoard.h /*! * Intel工廠子類 * * @since V1.0 */ @interface IntelFactory : FactoryBase @end
電腦工程師類:
#import#import CpuBase.h #import MainBoardBase.h #import FactoryBase.h /*! * 電腦工程師類 * * @since V1.0 */ @interface ComputerEngineer : NSObject @property(nonatomic,retain)CpuBase* cpu;//CPU基類 @property(nonatomic,retain)MainBoardBase* mainBoard;//主板基類 -(void)makeComputer:(FactoryBase*)factoryBase; /*! * 組裝硬件 * * @param factoryBase 工廠基類 * * @since V1.0 */ -(void)prepareHardwares:(FactoryBase*)factoryBase; @end
客戶端類:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //創建裝機工程師對象 ComputerEngineer* cf = [[ComputerEngineer alloc] init]; //客戶選擇並創建需要使用的產品對象 FactoryBase* af = [[IntelFactory alloc] init]; // FactoryBase* af = [[AMDFactory alloc] init]; //告訴裝機工程師自己選擇的產品,讓裝機工程師組裝電腦 [cf makeComputer:af]; }
以上是所有內容,希望對大家有所幫助。
實例代碼下載地址:http://download.csdn.net/detail/u010013695/6946281