2011年4月19日 星期二

Design Pattern - Factory

Factory Pattern(工廠模式),在某些介紹中,會被稱為Simple Factory Pattern(簡單工廠模式),
看到名稱,就知道這個模式非常的簡單,很可能閣下已經不知不覺地使用工廠模式很多年了。
在介紹此模式之前,我們先來看一個沒有套用工廠模式的例子,然後設法將這個例子加以修改成工廠模式。


未套用工廠模式之前


我們會發現,每顆西瓜都要設定甜度和大小,
所以可以把這些固定的程序放到一個方法中。

套用工廠模式之後


(增加Watermelon的建構子Watermelon(int sweetness, int size),也可以達到同樣目的)

當工廠生產的產品不止一種

然後,農夫不想只種一種西瓜,現在西瓜分成小玉西瓜、紅肉西瓜、無子西瓜三種,
所以,程式變成:


接著,農夫發現,小玉西瓜、紅肉西瓜、無子西瓜其實都是西瓜的一種,
所以將西瓜獨立成一個介面:


然後Farm中只使用一個method,藉由傳入參數的不同,決定生產何種西瓜:


改善工廠中的生產方法

在上述例子中我們可以發現,如果現在又多了一種西瓜,叫做方型西瓜,
就得修改Farm中的createWatermelon方法,增加一個else if。
為了降低工廠類別和產品類別之間的耦合度(coupling),
達到鬆散耦合(Loose Coupling),
就我所知,可以利用三種方式來達到:

第一種方式:Reflection(反射)


第二種方式:Registration(註冊)


前提是必須在每個產品的類別裡,進行註冊。

例如:


而且client端在一開始就必須知道會使用到哪些產品,
也就是在程式一開始的時候,就通知這些產品去進行註冊。


第三種方式:Factory Method Pattern

為了不修改原本的Farm,於是在設計時,先將Farm定義為抽象類別:


當有新產品的時候,就由繼承Farm的新工廠來製造,例如:


Abstract Factory vs. Factory Method vs. Factory

本文暫不介紹何謂Abstract Factory Pattern,
因為擴充Factory Method Pattern的工廠數和產品種類,
就形成了Abstract Factory Pattern。

(Factory pattern也能視為Factory Method Pattern的簡化版本)

以下簡單列出常見的三種工廠相關模式的比較:

比較項目 抽象工廠模式 工廠方法模式 簡單工廠模式
工廠數 多個 多個 一個
產品種類 多種 多種 一種
工廠生產線數目 多條 一條 一條

延伸閱讀:Template Method Pattern

沒有留言:

張貼留言