讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中如何实现工厂模式 静态工厂与抽象工厂实现对比

星婷姑娘_1113

星婷姑娘_1113

发布时间:2025-08-07 12:03:01

|

520人浏览过

|

来源于php中文网

原创

c++中实现工厂模式的主要目的是解耦对象的创建与使用,常见方式有静态工厂和抽象工厂。1. 静态工厂通过一个类的静态方法根据参数返回不同类型的对象,结构清晰、实现简单,适合产品种类固定、变化少的项目,但扩展性差,新增产品需修改工厂逻辑;2. 抽象工厂提供接口用于创建一组相关或依赖对象的家族,支持多产品族,符合开闭原则,易于扩展,适合系统有多套完整产品线且需统一管理的场景,但结构复杂、代码量大;选择上,若仅需创建单一类型且变动少的产品用静态工厂,若有多个产品族应使用抽象工厂,初期可用静态工厂后期重构为抽象工厂以适应扩展需求。

C++中如何实现工厂模式 静态工厂与抽象工厂实现对比

在C++中实现工厂模式,主要目的是为了解耦对象的创建与使用。工厂模式常见的两种实现方式是静态工厂和抽象工厂,它们适用于不同的场景。

C++中如何实现工厂模式 静态工厂与抽象工厂实现对比

静态工厂:简单直接的对象创建方式

静态工厂是最简单的工厂实现方式,通常是一个类中的静态方法,根据传入的参数返回不同类型的对象。

实现方式

定义一个工厂类,在其中写一个静态方法,根据参数决定返回哪种具体类的实例:

立即学习“C++免费学习笔记(深入)”;

windows-auto
windows-auto

Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。

下载
C++中如何实现工厂模式 静态工厂与抽象工厂实现对比
class Product {
public:
    virtual void use() = 0;
};

class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A" << std::endl;
    }
};

class ConcreteProductB : public Product {
public:
    void use() override {
        std::cout << "Using Product B" << std::endl;
    }
};

class SimpleFactory {
public:
    static Product* createProduct(const std::string& type) {
        if (type == "A") return new ConcreteProductA();
        if (type == "B") return new ConcreteProductB();
        return nullptr;
    }
};

特点与适用场景

  • 优点:结构清晰、实现简单。
  • 缺点:扩展性差,新增产品类型需要修改工厂逻辑,违反开闭原则。
  • 适合用在产品种类固定、变化少的项目中。

抽象工厂:支持多个产品族的复杂结构

抽象工厂适用于有多个产品族(product family)的情况,每个产品族中包含多种产品类型,而且要求同一族的产品之间有兼容性约束。

实现方式

抽象工厂的核心是提供一组接口,用于创建一组相关或依赖对象的家族,而无需指定具体的类。

C++中如何实现工厂模式 静态工厂与抽象工厂实现对比
// 产品族1的产品A
class ProductA1 : public Product {
public:
    void use() override {
        std::cout << "ProductA1" << std::endl;
    }
};

// 产品族2的产品A
class ProductA2 : public Product {
public:
    void use() override {
        std::cout << "ProductA2" << std::endl;
    }
};

// 工厂接口
class AbstractFactory {
public:
    virtual Product* createProduct() = 0;
};

// 具体工厂1:生产族1的产品
class ConcreteFactory1 : public AbstractFactory {
public:
    Product* createProduct() override {
        return new ProductA1();
    }
};

// 具体工厂2:生产族2的产品
class ConcreteFactory2 : public AbstractFactory {
public:
    Product* createProduct() override {
        return new ProductA2();
    }
};

特点与适用场景

  • 优点:支持多产品族,符合开闭原则,易于扩展。
  • 缺点:结构复杂,代码量大。
  • 适合用在系统中有多套完整产品线,且需要统一管理的场景。

如何选择:静态工厂 vs 抽象工厂?

  • 如果你只需要创建单一类型的产品,并且产品种类不会频繁变动,静态工厂就足够了。
  • 如果你的系统中有多个产品族,比如“Windows风格组件”和“Mac风格组件”,并且每个族里都有按钮、文本框等不同组件,那么应该考虑使用抽象工厂。

几点建议:

  • 初期可以先用静态工厂,后期发现需要扩展成多族时再重构为抽象工厂。
  • 使用智能指针管理内存能避免手动 delete 的问题。
  • 抽象工厂更适合配合配置文件或插件机制动态加载不同的工厂实现。

基本上就这些。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5109

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

3211

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

965

2023.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3319

2023.07.26

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn