工厂模式选择场景指南

👋 前言
工厂模式是最常用的创建型设计模式之一,它提供了一种创建对象的最佳方式。工厂模式主要包括三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。
本指南将通过思维导图和详细说明,帮助您理解各种工厂模式的适用场景,为您的项目选择合适的实现方式。
🧠 工厂模式选择决策树
📊 三种工厂模式对比
|--------|-----------------|-------------------|-----------------------|------------------|
| 工厂模式 | 核心思想 | 优点 | 缺点 | 适用场景 |
| 简单工厂模式 | 静态方法根据参数创建产品 | 实现简单,易于理解 | 违反开闭原则,添加新产品需要修改工厂代码 | 产品类型较少且固定的场景 |
| 工厂方法模式 | 定义工厂接口,具体工厂创建产品 | 遵循开闭原则,易于扩展,解耦程度高 | 增加了类的数量,实现复杂度较高 | 产品类型较多且需要频繁扩展的场景 |
| 抽象工厂模式 | 创建相关产品族 | 保证产品兼容性,封装性好 | 扩展新的产品类型困难,需要修改抽象工厂接口 | 需要创建一系列相关产品的场景 |
🎯 详细适用场景
- 简单工厂模式
适用场景:
产品类型较少,且固定不变
不需要频繁扩展新的产品类型
希望隐藏产品创建的具体细节
项目规模较小,对设计模式要求不高
典型应用:
日志记录器:根据配置创建不同类型的日志记录器(文件日志、控制台日志)
数据库连接:根据参数创建不同数据库的连接(MySQL、SQLite)
图形库:根据参数创建不同形状(圆形、矩形)
代码示例:
// 简单工厂:根据类型参数创建产品 Product* product = SimpleFactory::createProduct("A");
- 工厂方法模式
适用场景:
产品类型较多,且需要频繁扩展新的产品类型
希望遵循开闭原则,对修改关闭,对扩展开放
系统需要较高的灵活性和可扩展性
产品创建过程复杂,需要封装创建逻辑
典型应用:
框架设计:如Spring框架的BeanFactory
插件系统:允许第三方开发者扩展新功能
游戏开发:创建不同类型的游戏角色
文档生成器:创建不同格式的文档(PDF、Word、HTML)
代码示例:
// 工厂方法:通过具体工厂创建产品 Creator* creator = new ConcreteCreatorA(); creator->someOperation(); // 内部调用factoryMethod()创建产品
- 抽象工厂模式
适用场景:
需要创建一系列相关或相互依赖的产品
系统需要保证产品之间的兼容性
系统独立于产品的创建、组合和表示
产品族可能需要扩展新的产品类型
典型应用:
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