抽象工廠模式 wiki

2022-08-09 06:09:16 字數 3301 閱讀 1410

維基百科,自由的百科全書

跳轉至: 導航、 搜尋

以統一塑模語言中的型別圖來表示抽象工廠

抽象工廠模式(英語:abstract factory pattern)是一種軟體開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程式需要建立抽象工廠的具體實現,然後使用抽象工廠作為介面來建立這一主題的具體物件。客戶端程式不需要知道(或關心)它從這些內部的工廠方法中獲得物件的具體型別,因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。

舉個例子來說,比如乙個抽象工廠類叫做documentcreator(文件建立器),此類提供建立若干種產品的介面,包括createletter()(建立信件)和createresume()(建立簡歷)。其中,createletter()返回乙個letter(信件),createresume()返回乙個resume(簡歷)。系統中還有一些documentcreator的具體實現類,包括fancydocumentcreatormoderndocumentcreator。這兩個類對documentcreator的兩個方法分別有不同的實現,用來建立不同的「信件」和「簡歷」(用fancydocumentcreator的例項可以建立fancyletterfancyresume,用moderndocumentcreator的例項可以建立modernlettermodernresume)。這些具體的「信件」和「簡歷」類均繼承自抽象類,即letterresume類。客戶端需要建立「信件」或「簡歷」時,先要得到乙個合適的documentcreator例項,然後呼叫它的方法。乙個工廠中建立的每個物件都是同乙個主題的(「fancy」或者「modern」)。客戶端程式只需要知道得到的物件是「信件」或者「簡歷」,而不需要知道具體的主題,因此客戶端程式從抽象工廠documentcreator中得到了letterresume類的引用,而不是具體類的物件引用。

「工廠」是建立產品(物件)的地方,其目的是將產品的建立與產品的使用分離。抽象工廠模式的目的,是將若干抽象產品的介面與不同主題產品的具體實現分離開。這樣就能在增加新的具體工廠的時候,不用修改引用抽象工廠的客戶端**。

使用抽象工廠模式,能夠在具體工廠變化的時候,不用修改使用工廠的客戶端**,甚至是在執行時。然而,使用這種模式或者相似的設計模式,可能給編寫**帶來不必要的複雜性和額外的工作。正確使用設計模式能夠抵消這樣的「額外工作」。

[隱藏] 

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 

;class macfactory:

public abstractfactory

macborder* createborder()}

;class winfactory:

public abstractfactory

winborder* createborder()}

;

那麼客戶可以根據需要選擇 mac 風格或者 win 風格來建立 button 或 border

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...