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

C++设计模式之创建型模式:工厂方法模式(Factory Method) - 教程

工厂方法模式(Factory Method)是创建型设计模式的一种,它定义了一个创建对象的接口,但将具体对象的实例化延迟到子类中。这种模式通过封装对象创建过程,实现了“创建与利用分离”,提高了代码的灵活性和可扩展性。

核心角色

工厂方法模式囊括4个关键角色:

  1. 产品(Product):定义所有具体产品的公共接口。
  2. 具体产品(ConcreteProduct):搭建产品接口的具体类。
  3. 工厂(Creator):声明工厂途径(用于创建产品),返回产品类型。
  4. 具体工厂(ConcreteCreator):实现工厂方法,返回具体产品实例。

实现示例

假设我们需要设计一个文档编辑器,支持创建不同类型的文档(如文本文档、表格文档),使用工厂方法模式的实现如下:

#include <iostream>#include <string>// 1. 产品接口(Product)class Document{public:virtual void open() = 0;virtual void save() = 0;virtual ~Document() = default;// 虚析构函数};// 2. 具体产品A(ConcreteProduct)class TextDocument: public Document {public:void open() override {std::cout <<"打开文本文档" << std::endl;}void save() override {std::cout <<"保存文本文档" << std::endl;}};// 2. 具体产品B(ConcreteProduct)class SpreadsheetDocument: public Document {public:void open() override {std::cout <<"打开表格文档" << std::endl;}void save() override {std::cout <<"保存表格文档" << std::endl;}};// 3. 工厂接口(Creator)class Application{public:// 工厂方法(纯虚函数,由子类实现)virtual Document* createDocument() = 0;// 业务方法(使用产品)void newDocument() {Document* doc = createDocument();// 调用工厂方法创建产品doc->open();// 其他操作...delete doc;// 释放资源}virtual ~Application() = default;};// 4. 具体工厂A(ConcreteCreator)class TextEditor: public Application {public:// 实现工厂方法:创建文本文档Document* createDocument() override {return new TextDocument();}};// 4. 具体工厂B(ConcreteCreator)class SpreadsheetEditor: public Application {public:// 实现工厂方法:创建表格文档Document* createDocument() override {return new SpreadsheetDocument();}};// 客户端代码int main() {// 创建文本编辑器(具体工厂)Application* textApp = new TextEditor();textApp->newDocument();// 内部会创建文本文档// 创建表格编辑器(具体工厂)Application* sheetApp = new SpreadsheetEditor();sheetApp->newDocument();// 内部会创建表格文档// 释放资源delete textApp;delete sheetApp;return 0;}

代码解析

  1. 产品接口(Document):定义了所有文档的通用行为(open()save())。
  2. 具体产品TextDocumentSpreadsheetDocument 分别实现了文本文档和表格文档的具体功能。
  3. 工厂接口(Application):声明了工厂方法 createDocument(),并通过 newDocument() 方法使用产品(体现“创建与使用分离”)。
  4. 具体工厂TextEditorSpreadsheetEditor 分别实现了创建文本文档和表格文档的工厂方法。

核心优势

  1. 解耦:客户端无需知道具体产品的类名,只需通过工厂接口创建对象。
  2. 可扩展性:新增产品时,只需添加对应的具体产品类和具体工厂类,无需修改现有代码(符合开闭原则)。
  3. 灵活性:经过更换具体工厂,可动态改变程序所使用的产品类型。

适用场景

  1. 当一个类不知道它所需要创建的对象的具体类型时。
  2. 当一个类希望由子类来决定创建哪个对象时。
  3. 当需要集中管理对象的创建逻辑,且未来可能扩展更多产品类型时。

与简单工厂模式的区别

工厂方法模式更适合产品类型较多或需要频繁扩展的场景,是对轻松工厂模式的进一步抽象和优化。

http://www.zskr.cn/news/11710.html

相关文章:

  • 2025/9/25
  • 读书笔记:揭开索引的两个常见误区
  • 获取用户ip所在城市
  • 完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?
  • 微波雷达模块在智能家居中的具体应用案例有哪些?
  • 三分
  • 完整教程:微服务基础2-网关路由
  • nginx ipv6 proxy配置
  • (三)数仓人必看!ODS 到 DWS 各层设计规范全解析,含同步/存储/质量核心要点
  • 【shell】系统资源不足fork: retry: Resource temporarily unavailable
  • 【语文训练】女乃龙?田力乃龙?
  • 抖动分为3个方面
  • 关于ubuntu 用户切换的细节 su - user 和su user
  • 用 SeaTunnel 同步 MySQL 到 Doris:全量增量 + SQL 过滤
  • 在CodeBolcks下wxSmith的C++编程教程——使用自定义绘制和鼠标处理创建项目
  • 10_ select/poll/epoll实现服务端的io多路复用
  • 模拟实战配置实验
  • 基于MATLAB S函数实现多智能体间歇通信仿真
  • comfyui-数字人
  • 我天,前端岗要消亡了吗?
  • java8的集合新API - --
  • 基于MATLAB/Simulink的500kW三相光伏逆变器仿真
  • Docker Compose启动多个镜像实例
  • 深入解析:⸢ 伍-Ⅱ⸥ ⤳ 默认安全治理实践:水平越权检测 前端安全防控
  • mkfx 对磁盘设置标签
  • kubelet源码阅读(二)——device plugin 的ListAndWatch过程
  • ​​[硬件电路-320]:模拟电路与数字电路,两者均使用晶体管(如BJT、MOSFET),但模拟电路利用其线性区,数字电路利用其开关特性。 - 指南
  • 源码安装fail2ban
  • 高效 PDF 处理利器:PDF-XChange Editor v10.7.3.401 特性解析与优化版分享
  • 类的继承与继承的覆盖