Factory Method設計模式

2021-05-11 11:06:44 字數 2899 閱讀 4370

一、 工廠方法(factory method)模式

工廠方法(factorymethod)模式是類的建立模式,其用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。

在工廠方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪乙個產品類被例項化這種細節。這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

在factory method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。

二、 factory method模式角色與結構:/

抽象工廠(creator)角色:是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。

具體工廠(concrete creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:bulbcreator與tubecreator。

抽象產品(product)角色:工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是light。

具體產品(concrete product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

三、 程式舉例:

using system;

public abstract   class light  

public class bulblight : light  

public override void turnoff()  

}  

public class tubelight : light  

public override void turnoff()  

}  

public abstract   class creator  

public class bulbcreator : creator  

}  

public class tubecreator : creator  

}  

public class client  

} 工廠方法的活動序列圖

活動過程包括:

客戶端建立bulbcreator物件,客戶端持有此物件的型別是creator,而實際型別是bulbcreator。然後客戶端呼叫bulbcreator的factory方法,之後bulbcreator呼叫bulblight的建構函式創造出產品bulblight物件。

四、 工廠方法模式與簡單工廠模式

工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。

工廠方法模式之所以有乙個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。

當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。

工廠方法模式退化後可以演變成簡單工廠模式。

五、 factory method模式演化

使用介面或抽象類

抽象工廠角色和抽象場頻角色都可以選擇由介面或抽象類實現。

使用多個工廠方法

抽象工廠角色可以規定出多於乙個的工廠方法,從而使具體工廠角色實現這些不同的工廠方法,這些方法可以提供不同的商業邏輯,以滿足提供不同的產品物件的任務。

產品的迴圈使用

工廠方法總是呼叫產品類的建構函式以建立乙個新的產品例項,然後將這個例項提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當複雜。

乙個常見的複雜邏輯就是迴圈使用產品物件。工廠物件將已經建立過的產品登記到乙個聚集中,然後根據客戶所請求的產品狀態,向聚集查詢。如果有滿足要求的產品物件,就直接將產品返回客戶端;如果聚集中沒有這樣的產品物件,那麼就建立乙個新的滿足要求的產品物件,然後將這個物件登記到聚集中,再返還給客戶端。"享元模式(flyweight pattern)"就是這樣乙個模式。

多型性的喪失和模式的退化

乙個工廠方法模式的實現依賴於工廠角色和產品角色的多型性。在有些情況下,這個模式可以出現退化。

工廠方法返回的型別應當是抽象型別,而不是具體型別。呼叫工廠方法的客戶端應當依賴抽象產品程式設計,而不是具體產品。如果工廠僅僅返回乙個具體產品物件,便違背了工廠方法的用意,發生退化,這時就不再是工廠模式了。

工廠的等級結構:工廠物件應當有乙個抽象的超型別。如果等級結構中只有乙個具體工廠類的話,抽象工廠就可以省略,發生了退化。

六、 factory method模式與其它模式的關係

與工廠方法模式有關的模式還包括:

模板方法模式、mvc模式、享元模式、備忘錄模式

七、 另外乙個例子

設計模式 Factory Method

這一篇介紹一下 gof設計模式中的 factory method 模式 factory method gof設計模式對 factory method 的定義 未使用工廠方法模式,在test類中的run方法中需要依靠具體的類建立物件,違背了依賴倒置原則,如果run方法需要呼叫其他的具體類建立物件,ru...

設計模式之factory method

在現實生活中,有很多東西都是作為附屬物出現的,如手機套附屬於手機,電腦膜附屬於電腦,我們很多時候都會把精力集中在主要物中,而忽略這些附屬物。物件導向程式設計能很好的反映現實中實際存在的物件以及關係,factory method設計模式是解決這樣的主從關係明顯的方法,能幫我們抓住主要重點。factor...

重學設計模式 Factory Method模式

1 意圖 定義乙個建立物件的介面,讓子類決定例項化哪乙個類。factory method模式使乙個類的例項化延遲到子類。2 問題 乙個類需要例項化另乙個類的派生類。但不知道是哪乙個。factory method允許派生類進行決策。3 解決方案 派生類對例項化哪個類和如何例項化做出決策。4 通用結構 ...