抽象工廠 (Abstract Factory)

★★★★Studied

FromDesign Patterns (GoF)大話設計模式Design Patterns Explained

📚 From the Books

抽象工廠 (Abstract Factory)ConceptCreational

提供一個介面,用來建立「一整族互相搭配的產品」,呼叫端只拿抽象產品、不知道也不在乎背後是哪一套具體實作,換整套只要換一個工廠物件。

🧠 When to Use

TIP

訊號:你的產品是「成套」出現的——Windows 的 Button + Checkbox + Menu,或 Mac 的那一套——而且絕對不能混搭。換主題、換平台、換資料庫方言時想一次切換整族。

⚖️ Structure & Variants

經典版 — 一個工廠介面產出一族產品
interface Button; interface Checkbox

interface GUIFactory {                       // 抽象工廠:定義一族產品的建立
    fun createButton(): Button
    fun createCheckbox(): Checkbox
}

class WinFactory : GUIFactory {
    override fun createButton() = WinButton()
    override fun createCheckbox() = WinCheckbox()
}
class MacFactory : GUIFactory {
    override fun createButton() = MacButton()
    override fun createCheckbox() = MacCheckbox()
}

// 用組合:把工廠傳進來,整套實作由它決定
class App(factory: GUIFactory) {
    private val button = factory.createButton()
    private val checkbox = factory.createCheckbox()
}
  • 換平台只換 factory 這一個物件,App 完全不動,且保證同族不混搭。
與 Factory Method 的差別
  • Factory Method單一產品的建立,靠繼承(子類 override 一個方法)。
  • Abstract Factory一族相關產品的建立,靠組合(傳入一個 factory 物件)。
  • 抽象工廠內部的每個方法,往往本身就是一個工廠方法
退化形 — 只剩一個方法時
  • 當一族只剩一個產品,抽象工廠就退化回工廠方法;硬留多介面只是過度設計。
  • 反之產品族很大、建立過程又複雜,常和 Builder 搭配:工廠決定「哪一族」,builder 負責「怎麼組」。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading