標籤:
一、抽象工廠(Abstract Factory)模式
抽象原廠模式是所有形態的原廠模式中最為抽象和最具一般性的一種形態。
為了方便引進抽象原廠模式,引進一個新概念:產品族(Product Family)。所謂產品族,是指位於不同產品等級結構,功能相關聯的產品組成的家族。
圖中一共有四個產品族,分佈於三個不同的產品等級結構中。只要指明一個產品所處的產品族以及它所屬的等級結構,就可以唯一的確定這個產品。
引進抽象原廠模式
所謂抽象工廠是指一個工廠等級結構可以建立出分屬於不同產品等級結構的一個產品族中的所有對象。如果用途來描述的話,如:
二、Abstract Factory模式角色與結構
圖中描述的東西用產品族描述如下:
抽象工廠(Abstract Factory)角色:擔任這個角色的是Factory 方法模式的核心,它是與應用系統商業邏輯無關的。
具體工廠(Concrete Factory)角色:這個角色直接在用戶端的調用下建立產品的執行個體。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
抽象產品(Abstract Product)角色:擔任這個角色的類是Factory 方法模式所建立的對象的父類,或它們共同擁有的介面。
具體產品(Concrete Product)角色:抽象原廠模式所建立的任何產品對象都是某一個具體產品類的執行個體。這是用戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。
三、在什麼情況下使用抽象原廠模式
在以下情況下應當使用抽象原廠模式:
- 一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有形態的原廠模式都是重要的。
- 這個系統有多於一個的產品族,而系統只消費其中某一產品族。
- 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
- 系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現。
四、抽象工廠的起源
據說最早的應用是用來建立在不同作業系統的視窗環境下都能夠啟動並執行系統。比如在Windows與Unix系統下都有視窗環境的構件,在每一個作業系統中,都有一個視窗構件組成的構件家族。我們可以通過一個抽象角色給出功能描述,而由具體子類給出不同作業系統下的具體實現,
可以發現上面產品類圖有兩個產品等級結構,分別是Button和Text;同時有兩個產品族:Unix產品族與Windows產品族。
系統對產品對象的建立要求由一個工廠的等級結構滿足。其中有兩個具體工廠角色,即UnixFactory和WinFactory。UnixFactory對象負責建立Unix產品族中的產品,而WinFactory負責建立Windows產品族中的產品。
顯然一個系統只能夠在某一個作業系統的視窗環境下運行,而不能同時在不同的作業系統上運行。所以,系統實際上只能消費屬於同一個產品族的產品。
在現代的應用中,抽象原廠模式的使用範圍已經大大擴大了,不再要求系統只能消費某一個產品族了。
五、抽象工廠的另外一個例子(如何設計抽象類別工廠留作思考)
六、“開放—封閉”原則
“開放—封閉”原則要求系統對擴充開放,對修改封閉。通過擴充達到增強其功能的目的。對於涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:
- 增加產品族:Abstract Factory很好的支援了“開放—封閉”原則。
- 增加新產品的等級結構:需要修改所有的工廠角色,沒有很好的支援“開放—封閉”原則
綜合起來,抽象原廠模式以一種傾斜的方式支援增加新的產品,它為新產品族的增加提供方便,而不能為新的產品等級結構的增加提供這樣的方便。
原始碼:http://pan.baidu.com/s/1gdsDaAf
抽象工廠(Abstract Factory)模式