every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog
0. 前言
以下是 簡單工廠模式、工廠方法模式 和 抽象工廠模式 的 Python 實現與對比,結合代碼示例和實際應用場景說明:
1. 簡單工廠模式(Simple Factory)
核心思想:由一個工廠類根據傳入的參數,動態決定創建哪一種產品類的實例。
適用場景:對象創建邏輯簡單,且不需要頻繁擴展新產品。
from abc import ABC, abstractmethod# 抽象產品
class Button(ABC):@abstractmethoddef render(self):pass# 具體產品
class WindowsButton(Button):def render(self):return "Windows 風格按鈕"class MacButton(Button):def render(self):return "Mac 風格按鈕"# 簡單工廠
class ButtonFactory:@staticmethoddef create_button(os_type: str) -> Button:if os_type == "windows":return WindowsButton()elif os_type == "mac":return MacButton()else:raise ValueError("未知操作系統類型")# 使用
button = ButtonFactory.create_button("windows")
print(button.render()) # 輸出: Windows 風格按鈕
特點:
- 優點:客戶端與具體產品解耦。
- 缺點:違反開閉原則(新增產品需修改工廠類)。
2. 工廠方法模式(Factory Method)
核心思想:將對象的創建延遲到子類,每個子類負責創建一種具體產品。
適用場景:需要支持多類產品的擴展,且創建邏輯較復雜。
from abc import ABC, abstractmethod# 抽象產品
class Button(ABC):@abstractmethoddef render(self):pass# 具體產品
class WindowsButton(Button):def render(self):return "Windows 按鈕"class MacButton(Button):def render(self):return "Mac 按鈕"# 抽象工廠
class Dialog(ABC):@abstractmethoddef create_button(self) -> Button:passdef render(self):button = self.create_button()return f"渲染 {button.render()}"# 具體工廠
class WindowsDialog(Dialog):def create_button(self) -> Button:return WindowsButton()class MacDialog(Dialog):def create_button(self) -> Button:return MacButton()# 使用
dialog = WindowsDialog()
print(dialog.render()) # 輸出: "渲染 Windows 按鈕"
特點:
- 優點:符合開閉原則(新增產品只需新增工廠子類)。
- 缺點:類數量增多(每個產品對應一個工廠)。
3. 抽象工廠模式(Abstract Factory)
核心思想:創建一組相關或依賴的對象(產品族),而不需指定具體類。
適用場景:需要創建多個系列的產品(如跨平臺的 UI 組件)。
from abc import ABC, abstractmethod# 抽象產品族
class Button(ABC):@abstractmethoddef render(self):passclass Checkbox(ABC):@abstractmethoddef render(self):pass# Windows 產品族
class WindowsButton(Button):def render(self):return "Windows 按鈕"class WindowsCheckbox(Checkbox):def render(self):return "Windows 復選框"# Mac 產品族
class MacButton(Button):def render(self):return "Mac 按鈕"class MacCheckbox(Checkbox):def render(self):return "Mac 復選框"# 抽象工廠
class GUIFactory(ABC):@abstractmethoddef create_button(self) -> Button:pass@abstractmethoddef create_checkbox(self) -> Checkbox:pass# 具體工廠
class WindowsFactory(GUIFactory):def create_button(self) -> Button:return WindowsButton()def create_checkbox(self) -> Checkbox:return WindowsCheckbox()class MacFactory(GUIFactory):def create_button(self) -> Button:return MacButton()def create_checkbox(self) -> Checkbox:return MacCheckbox()# 使用
def client_code(factory: GUIFactory):button = factory.create_button()checkbox = factory.create_checkbox()print(f"{button.render()} + {checkbox.render()}")client_code(WindowsFactory()) # 輸出: "Windows 按鈕 + Windows 復選框"
client_code(MacFactory()) # 輸出: "Mac 按鈕 + Mac 復選框"
特點:
- 優點:支持產品族的擴展,保證兼容性。
- 缺點:代碼復雜度高,新增產品族需修改抽象工廠接口。
4. 三種模式對比總結
模式 | 核心區別 | 適用場景 |
---|---|---|
簡單工廠 | 一個工廠類創建所有產品 | 產品類型固定,無需擴展 |
工廠方法 | 每個產品對應一個工廠子類 | 需要支持單一產品的多維度擴展 |
抽象工廠 | 一個工廠創建一組相關產品(產品族) | 需要保證多個產品的兼容性(如 UI) |
選擇建議:
- 從簡單工廠 → 工廠方法 → 抽象工廠,靈活性遞增,但復雜度也遞增。
- 根據業務需求選擇最簡單能滿足的模式。