很好!你現在已經開始接觸設計模式了,而**抽象工廠模式(Abstract Factory Pattern)是一種常用于“創建一系列相關產品”**的經典設計模式。
我會一步步幫你理解:
🧠 一句話解釋
抽象工廠模式:提供一個接口,用于創建一系列相關或相互依賴的對象,而無需指定它們的具體類。
🎯 為什么需要它?
當你面對以下場景時,它就很有用:
“我有多個產品(按鈕、窗口、菜單),而且這些產品有不同的風格(比如 Mac 風格、Windows 風格),希望能在不改代碼的前提下切換整套產品風格。”
? 舉個生活類比
你要布置房間,選一整套家具。你不能桌子 IKEA 風、椅子中式風格,應該風格統一。
- 工廠1:生產一整套「現代風」家具(現代風沙發 + 現代風桌子)
- 工廠2:生產一整套「中式風」家具(中式風沙發 + 中式風桌子)
→ 你只選工廠,不關心家具內部怎么造。
🧪 Python 完整代碼示例
🧱 Step 1: 抽象產品類
from abc import ABC, abstractmethodclass Button(ABC):@abstractmethoddef click(self):passclass Window(ABC):@abstractmethoddef open(self):pass
🏭 Step 2: 具體產品類
class MacButton(Button):def click(self):print("Mac Button clicked!")class WinButton(Button):def click(self):print("Windows Button clicked!")class MacWindow(Window):def open(self):print("Mac Window opened!")class WinWindow(Window):def open(self):print("Windows Window opened!")
🏗? Step 3: 抽象工廠類
class GUIFactory(ABC):@abstractmethoddef create_button(self) -> Button:pass@abstractmethoddef create_window(self) -> Window:pass
🏢 Step 4: 具體工廠類
class MacFactory(GUIFactory):def create_button(self):return MacButton()def create_window(self):return MacWindow()class WinFactory(GUIFactory):def create_button(self):return WinButton()def create_window(self):return WinWindow()
🖥? Step 5: 客戶端代碼
def render_ui(factory: GUIFactory):button = factory.create_button()window = factory.create_window()button.click()window.open()# 使用 Mac 風格
render_ui(MacFactory())
# 使用 Windows 風格
render_ui(WinFactory())
🧭 流程圖(Mermaid)
? 優點
- ? 保證產品族之間的一致性(按鈕 + 窗口風格一致)
- ? 封裝創建邏輯,符合開閉原則
- ? 易于切換產品系列(換工廠即可)
? 缺點
- ? 類和接口數量增加(每種產品都要寫抽象 + 實現)
- ? 擴展“新產品”不方便(比如新增菜單)→ 要修改所有工廠
🔚 總結口訣
? 抽象工廠負責生產“產品系列”,只換工廠,不動邏輯。適用于“同一風格的多組件系統”。
如果你希望,我可以把這個例子替換成游戲皮膚工廠、汽車工廠、手機UI工廠來幫助你更貼近生活。你想試試哪個?🎮🚗📱