工廠模式

541732025發表於2014-09-05
【轉載】原文見http://zyjustin9.iteye.com/blog/2094960

簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,最佳化了系統的架構,並且增強了系統的擴充套件性。

本文是本人對這三種模式學習後的一個小結以及對他們之間的區別的理解。

 

簡單工廠

簡單工廠模式的工廠類一般是使用靜態方法,透過接收的引數的不同來返回不同的物件例項。

不修改程式碼的話,是無法擴充套件的


工廠模式


工廠方法

工廠方法是針對每一種產品提供一個工廠類。透過不同的工廠例項來建立不同的產品例項。

在同一等級結構中,支援增加任意產品


工廠模式

抽象工廠

抽象工廠是應對產品族概念的。比如說,每個汽車公司可能要同時生產轎車,貨車,客車,那麼每一個工廠都要有建立轎車,貨車和客車的方法。

應對產品族概念而生,增加新的產品線很容易,但是無法增加新的產品


工廠模式

小結

★工廠模式中,重要的是工廠類,而不是產品類。產品類可以是多種形式,多層繼承或者是單個類都是可以的。但要明確的,工廠模式的介面只會返回一種型別的例項,這是在設計產品類的時候需要注意的,最好是有父類或者共同實現的介面。

★使用工廠模式,返回的例項一定是工廠建立的,而不是從其他物件中獲取的。

★工廠模式返回的例項可以不是新建立的,返回由工廠建立好的例項也是可以的。

 

區別

簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增加新的產品,無能為力)

工廠方法 :用來生產同一等級結構中的固定產品。(支援增加任意產品)   
抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支援增加產品族)  

 

以上三種工廠 方法在等級結構和產品族這兩個方向上的支援程度不同。所以要根據情況考慮應該使用哪種方法。  

 

簡單工廠優點:客戶端可以免除直接建立產品物件的責任,而僅僅是“消費”產品。簡單工廠模式透過這種做法實現了對責任的分割。

工廠方法有點:允許系統在不修改具體工廠角色的情況下引進新產品。 

抽象工廠優點:向客戶端提供一個介面,使得客戶端在不必指定產品具體型別的情況下,建立多個產品族中的產品物件。 

 

第二種表述方式

簡單工廠、工廠方法和抽象工廠都是建立型的設計模式。

三者的共同點是:

1、都有兩種作用不同的類:產品類和工廠類。其中,工廠類在自己的方法中例項化產品類(即使用new命令生成產品類的物件),並將生成的產品類的物件提供給外部使用。

2、建立的過程,都是類似的:工廠類得到一個標誌(可以由程式輸入,也可以讀取配置檔案中的內容),返回一個產品物件。 

三者的不同點

1、簡單工廠

簡單工廠方法中,包括一個“抽象產品類(該類可以是介面Interface,也可以是實際的類Class),所有需要的產品類都是該抽象產品類的子類(如果是介面的話,那麼就是說所有產品類都繼承了該介面)。

簡單工廠一般只包含一個具體的工廠類,由該工廠類生成所有的產品類的物件。生成產品類的方法,其內部一般是類似於switch的結構,根據輸入的標誌,選擇建立不同型別的物件。由於不知道建立的物件到底是哪個類的,所以方法的返回值的型別是抽象產品類

 

2、工廠方法

抽象工廠中,包括“抽象工廠類抽象產品類,同時包含不只一個工廠類。所有的工廠類都必須是抽象工廠類的子類,所有的產品都必須是抽象產品類的子類。

和簡單工廠比起來,工廠方法一般是從抽象工廠開始的。一般都是在抽象工廠類中提供一個靜態方法,由該方法根據輸入的標誌,生成不同的具體工廠類,然後由具體的產品類生成具體的產品。注意,一個具體工廠類只能生成一種具體的產品類的物件,不同的具體工廠生成不同的產品,而不是像簡單工廠中那樣,一個工廠類可以生成多種不同產品類的物件。可以這麼理解,在選擇不同的具體工廠類的時候,就選擇了生成的產品,相對於簡單工廠,相當於將選擇產品的動作提前了。

因為不知道建立的具體工廠類到底是哪一個,所以生成具體工廠類的靜態方法的返回值的型別是“抽象工廠類。具體工廠類生成產品類的方法,返回值的型別也要求是抽象產品類(因為前端呼叫的時候,需要使用同樣的程式碼來訪問)。 


3、抽象工廠

抽象工廠和工廠方法很類似,區別如下: 

工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類。   
一個抽象工廠類,可以派生出多個具體工廠類。   
每個具體工廠類只能建立一個具體產品類的例項。 

抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。   
一個抽象工廠類,可以派生出多個具體工廠類。   
每個具體工廠類可以建立多個具體產品類的例項。       
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。   
工廠方法模式的具體工廠類只能建立一個具體產品類的例項,而抽象工廠模式可以建立多個

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1264526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章