C++ 工厂模式

工厂模式选择场景指南

👋 前言

工厂模式是最常用的创建型设计模式之一,它提供了一种创建对象的最佳方式。工厂模式主要包括三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。

本指南将通过思维导图和详细说明,帮助您理解各种工厂模式的适用场景,为您的项目选择合适的实现方式。

🧠 工厂模式选择决策树

📊 三种工厂模式对比

|--------|-----------------|-------------------|-----------------------|------------------|
| 工厂模式 | 核心思想 | 优点 | 缺点 | 适用场景 |
| 简单工厂模式 | 静态方法根据参数创建产品 | 实现简单,易于理解 | 违反开闭原则,添加新产品需要修改工厂代码 | 产品类型较少且固定的场景 |
| 工厂方法模式 | 定义工厂接口,具体工厂创建产品 | 遵循开闭原则,易于扩展,解耦程度高 | 增加了类的数量,实现复杂度较高 | 产品类型较多且需要频繁扩展的场景 |
| 抽象工厂模式 | 创建相关产品族 | 保证产品兼容性,封装性好 | 扩展新的产品类型困难,需要修改抽象工厂接口 | 需要创建一系列相关产品的场景 |

🎯 详细适用场景

  1. 简单工厂模式

适用场景:

产品类型较少,且固定不变

不需要频繁扩展新的产品类型

希望隐藏产品创建的具体细节

项目规模较小,对设计模式要求不高

典型应用:

日志记录器:根据配置创建不同类型的日志记录器(文件日志、控制台日志)

数据库连接:根据参数创建不同数据库的连接(MySQL、SQLite)

图形库:根据参数创建不同形状(圆形、矩形)

代码示例:

复制代码
// 简单工厂:根据类型参数创建产品 Product* product = SimpleFactory::createProduct("A"); 
  1. 工厂方法模式

适用场景:

产品类型较多,且需要频繁扩展新的产品类型

希望遵循开闭原则,对修改关闭,对扩展开放

系统需要较高的灵活性和可扩展性

产品创建过程复杂,需要封装创建逻辑

典型应用:

框架设计:如Spring框架的BeanFactory

插件系统:允许第三方开发者扩展新功能

游戏开发:创建不同类型的游戏角色

文档生成器:创建不同格式的文档(PDF、Word、HTML)

代码示例:

复制代码
// 工厂方法:通过具体工厂创建产品 Creator* creator = new ConcreteCreatorA();  creator->someOperation(); // 内部调用factoryMethod()创建产品
  1. 抽象工厂模式

适用场景:

需要创建一系列相关或相互依赖的产品

系统需要保证产品之间的兼容性

系统独立于产品的创建、组合和表示

产品族可能需要扩展新的产品类型

典型应用:

UI框架:创建不同平台的UI组件(Windows、Mac、Linux)

主题系统:创建配套的按钮、文本框、菜单等组件

数据库访问层:创建数据库连接和命令对象

游戏引擎:创建不同风格的游戏资源(角色、场景、道具)

代码示例:

复制代码
// 抽象工厂:创建相关产品族 GUIFactory* factory = new WindowsFactory(); Button* button = factory->createButton(); TextBox* textBox = factory->createTextBox(); 

💡 最佳实践建议

优先考虑工厂方法模式:

遵循开闭原则,易于扩展

解耦程度高,代码结构清晰

适合大多数中等规模的项目

简单场景使用简单工厂模式:

实现简单,学习成本低

适合产品类型较少的场景

可以快速实现需求

复杂产品族使用抽象工厂模式:

保证产品之间的兼容性

封装性好,客户端代码简洁

适合需要创建一系列相关产品的场景

避免过度设计:

根据实际需求选择合适的工厂模式

不要为了使用设计模式而使用设计模式

简单场景可以直接实例化对象

考虑代码维护性:

选择团队成员熟悉的实现方式

保持代码风格一致性

适当添加注释和文档

📝 代码设计建议

抽象产品设计:

定义清晰的产品接口,包含产品的核心功能

避免在接口中添加过多具体实现细节

考虑接口的稳定性和可扩展性

工厂设计:

工厂类职责单一,只负责创建产品

工厂方法命名清晰,如createProduct()、makeObject()

考虑异常处理,如无效产品类型的处理

客户端使用:

客户端只依赖抽象工厂和抽象产品

避免直接实例化具体产品类

使用依赖注入或配置文件来选择具体工厂

🎓 学生实践建议

从简单工厂开始学习:

理解工厂模式的核心思想

掌握产品创建的封装

学习简单工厂的优缺点

逐步学习工厂方法和抽象工厂:

理解开闭原则的应用

掌握产品族的概念

比较三种工厂模式的差异

编写实际项目代码:

在小型项目中应用工厂模式

尝试扩展新的产品类型

体会不同工厂模式的实际效果

阅读开源项目代码:

查看Spring、Qt等框架中的工厂模式应用

学习优秀的工厂模式设计案例

理解大型项目中的工厂模式实践

📌 总结

选择合适的工厂模式需要考虑多个因素:

项目需求:是否需要创建多种产品,是否需要扩展

产品特性:产品类型数量,是否为相关产品族

设计原则:是否需要遵循开闭原则

团队能力:团队成员对设计模式的熟悉程度

项目规模:小型项目可以简化设计,大型项目需要更规范的设计

通过本指南的学习,相信您已经对各种工厂模式的适用场景有了清晰的理解。在实际项目中,根据具体需求选择合适的实现方式,才能发挥工厂模式的最大价值。

祝您学习愉快,编程顺利! 🚀

01

CMakeLists.txt

复制代码
# CMakeLists.txt - 工厂模式项目构建配置文件# 用于配置C++项目的编译选项和构建流程# 设置CMake的最低版本要求cmake_minimum_required(VERSION 3.10)# 设置项目名称和版本号project(FactoryPattern VERSION 1.0.0)# 设置C++标准版本为C++11,支持智能指针和删除函数等特性set(CMAKE_CXX_STANDARD 11)# 设置C++编译器标志,启用警告提示和标准严格模式set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")# 设置可执行文件的输出目录为当前目录下的build文件夹set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build)# 创建可执行文件并链接源文件add_executable(factory_pattern    main.cpp    simple_factory.h    simple_factory.cpp    factory_method.h    factory_method.cpp    abstract_factory.h    abstract_factory.cpp)

02

03

获取

通过网盘分享的文件:CXX工厂模式factory_pattern

链接: https://pan.baidu.com/s/1hhgfpsiA2qqh-bb4fG9u3Q?pwd=ys19 提取码: ys19

相关推荐
2501_944525549 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 预算详情页面
android·开发语言·前端·javascript·flutter·ecmascript
2301_790300969 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
zhuqiyua9 小时前
第一次课程家庭作业
c++
9 小时前
java关于内部类
java·开发语言
好好沉淀9 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
只是懒得想了9 小时前
C++实现密码破解工具:从MD5暴力破解到现代哈希安全实践
c++·算法·安全·哈希算法
lsx2024069 小时前
FastAPI 交互式 API 文档
开发语言
VCR__9 小时前
python第三次作业
开发语言·python
码农水水9 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
wkd_00710 小时前
【Qt | QTableWidget】QTableWidget 类的详细解析与代码实践
开发语言·qt·qtablewidget·qt5.12.12·qt表格