維基百科,自由的百科全書
跳轉至: 導航、 搜尋
以統一塑模語言中的型別圖來表示抽象工廠
抽象工廠模式(英語:abstract factory pattern)是一種軟體開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程式需要建立抽象工廠的具體實現,然後使用抽象工廠作為介面來建立這一主題的具體物件。客戶端程式不需要知道(或關心)它從這些內部的工廠方法中獲得物件的具體型別,因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。
舉個例子來說,比如乙個抽象工廠類叫做documentcreator
(文件建立器),此類提供建立若干種產品的介面,包括createletter()
(建立信件)和createresume()
(建立簡歷)。其中,createletter()
返回乙個letter
(信件),createresume()
返回乙個resume
(簡歷)。系統中還有一些documentcreator
的具體實現類,包括fancydocumentcreator
和moderndocumentcreator
。這兩個類對documentcreator
的兩個方法分別有不同的實現,用來建立不同的「信件」和「簡歷」(用fancydocumentcreator
的例項可以建立fancyletter
和fancyresume
,用moderndocumentcreator
的例項可以建立modernletter
和modernresume
)。這些具體的「信件」和「簡歷」類均繼承自抽象類,即letter
和resume
類。客戶端需要建立「信件」或「簡歷」時,先要得到乙個合適的documentcreator
例項,然後呼叫它的方法。乙個工廠中建立的每個物件都是同乙個主題的(「fancy」或者「modern」)。客戶端程式只需要知道得到的物件是「信件」或者「簡歷」,而不需要知道具體的主題,因此客戶端程式從抽象工廠documentcreator
中得到了letter
或resume
類的引用,而不是具體類的物件引用。
「工廠」是建立產品(物件)的地方,其目的是將產品的建立與產品的使用分離。抽象工廠模式的目的,是將若干抽象產品的介面與不同主題產品的具體實現分離開。這樣就能在增加新的具體工廠的時候,不用修改引用抽象工廠的客戶端**。
使用抽象工廠模式,能夠在具體工廠變化的時候,不用修改使用工廠的客戶端**,甚至是在執行時。然而,使用這種模式或者相似的設計模式,可能給編寫**帶來不必要的複雜性和額外的工作。正確使用設計模式能夠抵消這樣的「額外工作」。
[隱藏]
4**舉例
5適用性6優點
7缺點8參考文獻9參見
抽象工廠模式的實質是「提供介面,建立一系列相關或獨立的物件,而不指定這些物件的具體類。」[1]
具體的工廠決定了建立物件的具體型別,而且工廠就是物件實際建立的地方(比如在c++中,用「new」操作符建立物件)。然而,抽象工廠只返回乙個指向建立的物件的抽象引用(或指標)。
這樣,客戶端程式呼叫抽象工廠引用的方法,由具體工廠完成物件建立,然後客戶端程式得到的是抽象產品的引用。如此使客戶端**與物件的建立分離開來。[2]
因為工廠僅僅返回乙個抽象產品的引用(或指標),所以客戶端程式不知道(也不會牽絆於)工廠建立物件的具體型別。然而,工廠知道具體物件的型別;例如,工廠可能從配置檔案中讀取某種型別。這時,客戶端沒有必要指定具體型別,因為已經在配置檔案中指定了。通常,這意味著:
guifactory
介面中的createbutton
方法返回button
型別的物件。返回button
的哪種實現依賴於使用guifactory
的哪種實現。
需要注意的是,為了簡潔起見,以上類圖僅僅展示了建立乙個型別物件的工廠。而在抽象工廠模式中,通常乙個工廠能夠建立若干種不同型別的物件。
假設我們有兩種產品介面 button 和 border ,每一種產品都支援多種系列,比如 mac 系列和 windows 系列。這樣每個系列的產品分別是 macbutton, winbutton, macborder, winborder 。為了可以在執行時刻建立乙個系列的產品族,我們可以為每個系列的產品族建立乙個工廠 macfactory 和 winfactory 。每個工廠都有兩個方法 createbutton 和 createborder 並返回對應的產品,可以將這兩個方法抽象成乙個介面 abstractfactory 。這樣在執行時刻我們可以選擇建立需要的產品系列。
我們的產品結構是這樣的
class button;對應的工廠是這樣的// abstract class
class macbutton:
public button
;class winbutton:
public button
;class border;
// abstract class
class macborder:
public border
;class winborder:
public border
;
class abstractfactory那麼客戶可以根據需要選擇 mac 風格或者 win 風格來建立 button 或 border;class macfactory:
public abstractfactory
macborder* createborder()}
;class winfactory:
public abstractfactory
winborder* createborder()}
;
abstractfactory* fac;switch
(style)
button* button = fac-
>createbutton();
border* border = fac-
>createborder();
抽象工廠模式 抽象工廠模式
抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...
工廠模式 抽象工廠模式
這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...
工廠模式 抽象工廠模式
子類父類代換 場景 在不同的條件下,需要建立不同的實現子類時。如網路通訊可以使用tcp udp。可以實現同乙個介面,通過工廠類根據條件 tcp或udp 來例項化不同的子類。這些子類符合黎克特制代換原則。public inte ce tlprotocol public class tcpimpleme...