2012年10月31日 星期三

Abstract Factory

目的

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
(以同一個介面來建立一整族相關或相依的物件,不需點明個物件真正所屬的具象類別。 [1])


Abstract Factory 特別的地方就在於他會負責建立「一整族」相關的物件
意思就是他會產生很多個物件,而物件之間基本上會有關聯性
在實作中 Abstract Factory 會利用好幾個 Factory Methods 來達成
在介紹 Factory Method中提到,一個 Product 會定應到一個 factory method
由於 Abstract Factory 針對的是「一整族」相關的物件
所以便可藉由好幾個 Factory Methods 來完成
這麼做的好處主要可以快速且容易地抽換掉整族物件
而且也可以凸顯出這些物件之間的關聯性

Abstract Factory 的 UML Class Diagram:
範例程式(新鮮紅茶店與一般紅茶店):

範例程式與 Class Diagram 的對應關係:

  • Client <==> BlackTeaStore
  • AbstractFactory <==> BlackTeaAbstractFactory
  • ConcreteFactory1 <==> FreshBlackTeaFactory
  • ConcreteFactory2 <==> OrdinaryBlackTeaFactory
  • AbstractProductA <==> BlackTea
  • ConcreteProductA1 <==> FreshBlackTea
  • ConcreteProductA2 <==> OrdinaryBlackTea
  • AbstractProductB <==> Sugar
  • ConcreteProductB1 <==> NaturalSugar
  • ConcreteProductB2 <==> ArtificialSugar


在三個關於 factory 的 patterns 中,這個是看起來最複雜的
但其實概念上並不難
Abstract Factory 精華處就在於他針對的是「一整族」的相關物件
至於 Simple Factory、Factory Method、Abstract Factory 三者之間有何差異
下一篇將會有更詳細地說明
最後別忘了回到前頭看看 Abstract Factory 的目的喔


[1] "物件導向設計模式", Gamma, Johnson, Helm, Vlissides 著, 葉秉哲譯