当前位置: 首页 > backend >正文

【设计模式】1.简单工厂、工厂、抽象工厂模式

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)

选择建议

  • 从简单工厂 → 工厂方法 → 抽象工厂,灵活性递增,但复杂度也递增
  • 根据业务需求选择最简单能满足的模式。
http://www.xdnf.cn/news/12884.html

相关文章:

  • ORACLE 修改端口号之后无法启动?
  • 港理工:LLM推理与推荐能力集成
  • ElGamal加密算法:离散对数难题的安全基石
  • (五)Linux性能优化-CPU-性能优化
  • GitOps 核心思想 - 当 Git 成为唯一信源
  • 2025-04-22-X86 架构与 Arm 架构异同及应用
  • Keil Mdk新建stm32工程找不到对应芯片开发包的解决方法
  • LeetCode - 148. 排序链表
  • Jupyter notebook的文章结构目录查看方式和汉化方法
  • 基于Matlab肺结节分割(肺结节提取)源程序,也有GUI人机界面版本。使用传统图像分割方法,非深度学习方法。使用LIDC-IDRI数据集。
  • RoseMirrorHA 双机热备全解析
  • Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
  • Unity VR/MR开发-开发环境准备
  • JS设计模式(5): 发布订阅模式
  • 矩阵详解:从基础概念到实际应用
  • 词法分析和词性标注 自然语言处理
  • Python Cookbook-7.13 生成一个字典将字段名映射为列号
  • 算法:位运算
  • AUTOSAR实战教程--DoIP_02_诊断链路建立流程
  • 零基础入门:5分钟学会OpenHands远程编程环境搭建
  • 在Pnetlab6上绕过TPM、安全启动和 RAM 检查安装windows 11笔记
  • 构建AI中台:从技术孤岛到智能服务能力平台化
  • 自然语言处理——语言模型
  • 基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究
  • gorm 配置数据库
  • LLMs 系列科普文(11)
  • 25.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户服务接口
  • vscode 配置 latex
  • Python-Flask
  • MCP Resource模块详解