Factory Method ( 3 . 3 ):定義一個用於建立對象的介面,讓子類決定將哪一個類執行個體化。
Factory Method使一個類的執行個體化延遲到其子類。
1. 意圖
定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。 Factory Method使一個類的
執行個體化延遲到其子類。
2. 別名
虛構造器( Virtual Constructor)
3. 動機
架構使用抽象類別定義和維護對象之間的關係。這些對象的建立通常也由架構負責。
考慮這樣一個應用程式框架,它可以向使用者顯示多個文檔。在這個架構中,兩個主要的抽象是
類Application和Document。這兩個類都是抽象的,客戶必須通過它們的子類來做與具體應用相
關的實現。例如,為建立一個繪圖應用,我們定義類 DrawingApplication和DrawingDocument。
A p p l i c a t i o n類負責管理 D o c u m e n t並根據需要建立它們 — 例如,當使用者從菜單中選擇 O p e n或
New的時候。
因為被執行個體化的特定 D o c u m e n t子類是與特定應用相關的,所以 A p p l i c a t i o n類不可能預測
到哪個 D o c u m e n t子類將被執行個體化 — A p p l i c a t i o n類僅知道一個新的文檔何時應被建立,而不
知道哪一種 D o c u m e n t將被建立。這就產生了一個尷尬的局面:架構必須執行個體化類,但是它只
知道不能被執行個體化的抽象類別。
Factory Method模式提供了一個解決辦案。它封裝了哪一個 D o c u m e n t子類將被建立的信
息並將這些資訊從該架構中分離出來,如下頁所示。
A p p l i c a t i o n的子類重定義 A p p l i c a t i o n的抽象操作 C r e a t e D o c u m e n t以返回適當的 D o c u m e n t
子類對象。一旦一個 A p p l i c a t i o n子類執行個體化以後,它就可以執行個體化與應用相關的文檔,而無
需知道這些文檔的類。我們稱 C r e a t e D o c u m e n t是一個Factory 方法( f a c t o r y m e t h o d)
,因為它負
責“生產”一個對象。
4. 適用性
在下列情況下可以使用 Factory Method模式:
• 當一個類不知道它所必須建立的對象的類的時候。
• 當一個類希望由它的子類來指定它所建立的對象的時候。
• 當類將建立對象的職責委託給多個協助子類中的某一個,並且你希望將哪一個協助子類
是代理者這一資訊局部化的時候。
5. 結 構
6. 參與者
• Product(Document)
— 定義Factory 方法所建立的對象的介面。
• ConcreteProduct(MyDocument)
— 實現Product介面。
• Creator(Application)
— 聲明Factory 方法,該方法返回一個 P r o d u c t類型的對象。 C r e a t o r也可以定義一個工廠方
法的預設實現,它返回一個預設的 ConcreteProduct對象。
— 可以調用Factory 方法以建立一個 Product對象。
• ConcreteCreator(MyApplication)
— 重定義Factory 方法以返回一個 ConcreteProduct執行個體。
7. 協作
• Creator依賴於它的子類來定義Factory 方法,所以它返回一個適當的 ConcreteProduct執行個體
class Factory:def createFruit(self,fruit):if fruit=="apple":return Apple()elif fruit=="banana":return Banana()class Fruit:def __str__(self):return "fruit"class Apple(Fruit):def __str__(self):return "apple"class Banana(Fruit):def __str__(self):return "banana"if __name__=="__main__":factory=Factory()print factory.createFruit("apple")print factory.createFruit("banana")
倒數第三行建立了Factory類的執行個體factory
輸出結果:
apple
Banana