看到名稱,就知道這個模式非常的簡單,很可能閣下已經不知不覺地使用工廠模式很多年了。
在介紹此模式之前,我們先來看一個沒有套用工廠模式的例子,然後設法將這個例子加以修改成工廠模式。
未套用工廠模式之前
我們會發現,每顆西瓜都要設定甜度和大小,
所以可以把這些固定的程序放到一個方法中。
套用工廠模式之後
(增加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
沒有留言:
張貼留言