目录

  1. 抽象工厂模式简介
  2. 抽象工厂模式的结构
  3. 抽象工厂模式的优缺点
  4. 抽象工厂模式的实现
    • 4.1 基本实现(Python 示例)
    • 4.2 实际应用案例
  5. 抽象工厂模式的应用场景
  6. 出站链接
  7. 站内链接
  8. 参考资料

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. 抽象工厂模式的优缺点

优点

  1. 确保产品之间的兼容性:所有产品都属于同一个产品族,避免不兼容的对象混用。
  2. 符合开闭原则(OCP):新增产品族时,只需创建新的具体工厂,而无需修改现有代码。
  3. 隐藏产品创建的细节:客户端代码不直接依赖具体类,而是依赖工厂接口,符合依赖倒置原则(DIP)
  4. 提高代码的可维护性:统一管理产品的创建,避免散乱的 new 操作。

缺点

  1. 增加了系统的复杂性:需要定义多个工厂和产品接口,增加了代码量。
  2. 难以扩展新的产品种类:如果要新增一个产品(如 TextBox),需要修改所有的工厂接口,违反了开闭原则(OCP)

4. 抽象工厂模式的实现

4.1 基本实现(Python 示例)

场景:创建WindowsMac 两个 UI 产品族,每个产品族包含 ButtonCheckbox

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️⃣ 数据库驱动

  • 使用抽象工厂模式创建 MySQLFactoryPostgreSQLFactory,生成不同的数据库连接对象。

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)
  • 适用于需要创建多个产品族的系统,但新增产品种类时会增加维护成本

如果你有特定的应用场景需要详细实现,可以告诉我!🚀