目录
- 抽象工厂模式简介
- 抽象工厂模式的结构
- 抽象工厂模式的优缺点
- 抽象工厂模式的实现
- 4.1 基本实现(Python 示例)
- 4.2 实际应用案例
- 抽象工厂模式的应用场景
- 出站链接
- 站内链接
- 参考资料
1. 抽象工厂模式简介
抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,用于提供一组相关或相互依赖的对象,而不需要指定它们的具体类。
为什么使用抽象工厂模式?
- 保证产品族的兼容性:确保一组产品可以一起工作,避免不兼容的对象组合。
- 隐藏对象的创建细节:客户端不需要知道具体的产品类,只需要使用工厂接口。
- 符合 依赖倒置原则(DIP) 和 开闭原则(OCP):新产品族可以通过扩展工厂类添加,而不修改现有代码。
2. 抽象工厂模式的结构
抽象工厂模式通常包含以下四个主要角色:
角色 | 作用 |
---|---|
抽象工厂(Abstract Factory) | 定义创建产品的方法接口,提供一系列相关产品的创建方法 |
具体工厂(Concrete Factory) | 实现抽象工厂接口,负责创建一组相关产品 |
抽象产品(Abstract Product) | 定义产品的公共接口 |
具体产品(Concrete Product) | 具体的产品实现,由具体工厂创建 |
UML 类图
┌───────────────────┐
│ AbstractFactory │
├───────────────────┤
│ + createButton() │
│ + createCheckbox()│
└─────────┬─────────┘
│
┌───────────────┴───────────────┐
│ │
┌──────────────┐ ┌──────────────┐
│ WindowsFactory │ │ MacFactory │
└──────────────┘ └──────────────┘
│ │
┌───────────────┐ ┌───────────────┐
│ WindowsButton │ │ MacButton │
└───────────────┘ └───────────────┘
┌───────────────┐ ┌───────────────┐
│ WindowsCheckbox│ │ MacCheckbox │
└───────────────┘ └───────────────┘
3. 抽象工厂模式的优缺点
✅ 优点
- 确保产品之间的兼容性:所有产品都属于同一个产品族,避免不兼容的对象混用。
- 符合开闭原则(OCP):新增产品族时,只需创建新的具体工厂,而无需修改现有代码。
- 隐藏产品创建的细节:客户端代码不直接依赖具体类,而是依赖工厂接口,符合依赖倒置原则(DIP)。
- 提高代码的可维护性:统一管理产品的创建,避免散乱的
new
操作。
❌ 缺点
- 增加了系统的复杂性:需要定义多个工厂和产品接口,增加了代码量。
- 难以扩展新的产品种类:如果要新增一个产品(如
TextBox
),需要修改所有的工厂接口,违反了开闭原则(OCP)。
4. 抽象工厂模式的实现
4.1 基本实现(Python 示例)
场景:创建Windows 和 Mac 两个 UI 产品族,每个产品族包含 Button
和 Checkbox
。
from abc import ABC, abstractmethod
# 1. 抽象产品类
class Button(ABC):
@abstractmethod
def render(self):
pass
class Checkbox(ABC):
@abstractmethod
def render(self):
pass
# 2. 具体产品类(Windows 系列)
class WindowsButton(Button):
def render(self):
return "Rendering Windows Button"
class WindowsCheckbox(Checkbox):
def render(self):
return "Rendering Windows Checkbox"
# 3. 具体产品类(Mac 系列)
class MacButton(Button):
def render(self):
return "Rendering Mac Button"
class MacCheckbox(Checkbox):
def render(self):
return "Rendering Mac Checkbox"
# 4. 抽象工厂类
class GUIFactory(ABC):
@abstractmethod
def create_button(self):
pass
@abstractmethod
def create_checkbox(self):
pass
# 5. 具体工厂类(Windows 工厂)
class WindowsFactory(GUIFactory):
def create_button(self):
return WindowsButton()
def create_checkbox(self):
return WindowsCheckbox()
# 6. 具体工厂类(Mac 工厂)
class MacFactory(GUIFactory):
def create_button(self):
return MacButton()
def create_checkbox(self):
return MacCheckbox()
# 7. 客户端代码(使用工厂模式创建对象)
def create_ui(factory: GUIFactory):
button = factory.create_button()
checkbox = factory.create_checkbox()
print(button.render())
print(checkbox.render())
# 选择不同的工厂
factory = WindowsFactory()
create_ui(factory)
factory = MacFactory()
create_ui(factory)
运行结果
Rendering Windows Button
Rendering Windows Checkbox
Rendering Mac Button
Rendering Mac Checkbox
4.2 实际应用案例
1️⃣ 数据库驱动
- 使用抽象工厂模式创建 MySQLFactory 和 PostgreSQLFactory,生成不同的数据库连接对象。
2️⃣ 跨平台 GUI 库
- Qt、Swing 采用抽象工厂模式支持不同操作系统的 UI 组件(Windows、macOS、Linux)。
3️⃣ 游戏开发
- 适配不同设备(PC、移动端、VR)的一组输入控制器(键盘、手柄、触摸屏)。
5. 抽象工厂模式的应用场景
- 跨平台应用开发(不同操作系统 UI 组件)
- 数据库访问层(不同数据库驱动的兼容性)
- 游戏开发(不同操作设备的输入适配)
- IoT 设备管理(不同品牌的智能家居设备,如灯泡、插座、摄像头)
6. 出站链接
7. 站内链接
8. 参考资料
- Gamma, E., Design Patterns: Elements of Reusable Object-Oriented Software (1994).
- Martin, R. C., Clean Code: A Handbook of Agile Software Craftsmanship (2009).
总结
- 抽象工厂模式适用于创建一组相关产品,如跨平台 UI 组件、数据库驱动等。
- 它保证了产品的兼容性,符合开闭原则(OCP)和依赖倒置原则(DIP)。
- 适用于需要创建多个产品族的系统,但新增产品种类时会增加维护成本。
如果你有特定的应用场景需要详细实现,可以告诉我!🚀
发表回复