分類

建立型模式。

這個模式在解決什麼

工廠模式要處理的核心問題是:建立物件這件事本身很容易變複雜,而我們不想讓呼叫端直接依賴具體類別。

它常見的目的有兩個:

  • 把「建立哪一個具體物件」的決策封裝起來
  • 讓上層程式依賴抽象,而不是一路 new 到具體實作

核心做法

這裡通常會提到兩種常見變體:

  • 工廠方法模式:在父類別中宣告工廠方法,讓子類別決定實際要建立哪種產品
  • 抽象工廠模式:先定義一組工廠介面,讓不同的具體工廠負責建立同一個產品家族中的多個元件

前者重點是把「某一個產品」的建立交給子類別延伸;後者重點是讓一整組彼此相容的產品可以一起被建立出來。

什麼時候適合用

下面幾種情況很適合用工廠模式:

  • 建立流程不只是單純 new 一個物件,而是伴隨初始化、配置或條件判斷
  • 系統可能會切換不同實作,但呼叫端不該知道具體類別
  • 你想把一整組相容的物件打包成同一套建立規則

如果只是很單純地建立一個小物件,直接建構通常就夠了,不一定需要引入工廠。

例子

假設遊戲裡要建立不同陣營的 UI 套件。若只是按平台切換按鈕樣式、面板樣式、提示框樣式,就很適合用抽象工廠,讓 FantasyThemeFactorySciFiThemeFactory 各自建立同一家族的元件。

如果只是要在不同情境下建立不同敵人類型,則可能用工廠方法就夠了,讓不同的生成器決定是產出近戰敵人、遠程敵人還是菁英敵人。

類圖

這一篇先記住的重點

  • 工廠模式的重點不是「幫你少打一個 new」,而是把建立責任集中管理
  • 工廠方法偏向單一產品的延伸點
  • 抽象工廠偏向一整個產品家族的一致性

參考書目

《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates