l

2013年8月19日 星期一

重新整理Factory Method Pattern

August 16 11:00~13:47

螢幕快照 2013-08-16 下午12.11.11

***

今天介紹一個看起來很簡單但是仔細一想又有點小複雜的模式:Factory Method。依據GoF書中的定義,Factory Method將產生類別的工作交由子類別來達成。因此「標準」的Factory Method在Creator類別身上會有一個Template Method(下圖中的operation),在這個Template Method裡面呼叫Factory Method來產生產品物件。實際產生的產品物件由ConcreteCreator(Creator類別的子類別)藉由覆寫Factory Method來決定。

螢幕快照 2013-08-16 下午1.29.15

 

在《Visual Basic Design Patterns: VB 6.0 and VB.NET》和《Head First Design Patterns》介紹了一個與Factory Method類似的模式叫做Simple Factory。Simple Factory也是一種Factory Method,也是將產生物件的過程寫在一個method裡面。主要的差別在於Simple Factory並沒有像「標準」的Factory Method一樣,要求產生產品物件的責任一定要交給子類來達成。如果把產生類別的這個method用static來實作,則這種作法又稱為Static Factory。

***

Factory Method、Simple Factory、Static Factory,哇哩勒,這麼多意思相近名稱又不同的模式,看到快暈倒。在《POSA 4》這本書裡面,把上述三種模式全部都歸類在Factory Method裡面,但是將Factory Method區分為三種不同的類型:

  • Simple Factory Method:Simple Factory
  • Polymorphic Factory Method:GoF書中「標準」的Factory Method。
  • Class Factory Method:Static Factory

背景資訊介紹完畢,接下來看整理後的結果。

***

Name:Factory Method

Context:許多物件導向程式語言提供我們用new表示式來產生物件,但並非所有的物件都可以簡單地透過new來產生。

Problem:如何產生一個物件?

Force:

  • 你有一群繼承自相同介面的產品物件,
    • 你想要將產生哪一個具體產品物件的責任交由子類別來決定,可能是因為在編譯期間你並不知道要產生哪一個具體類別,又或者是你想要提供子類別產生具體產品類別的彈性。
    • 你允許客戶端傳入參數來選擇所要產生的具體類別。
  • 物件產生之後尚須經過經過適當的設定步驟才可以傳回給客戶端使用,如果可以將產生物件的過程從客戶端抽離出來,則可以避免客戶端產生重複的程式碼。

Solution:將產生物件的詳細步驟封裝在一個factory method裡面,讓客戶端程式透過這個factory method來得到新的物件。

***

友藏內心獨白:8/23,完成率34.78%。

1 則留言: