很好!你现在已经开始接触设计模式了,而**抽象工厂模式(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工厂来帮助你更贴近生活。你想试试哪个?🎮🚗📱