0

0

c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

穿越時空

穿越時空

发布时间:2025-10-29 16:02:02

|

569人浏览过

|

来源于php中文网

原创

工厂模式通过解耦对象创建提升代码灵活性,C++中可用基类指针与多态实现:1. 简单工厂根据参数创建具体产品;2. 工厂方法将创建延迟到子类;3. 抽象工厂用于创建相关对象族;4. 结合智能指针优化内存管理,避免泄漏。

c++如何实现工厂模式_c++工厂(factory)设计模式实现方法

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在C++中,通过基类指针和多态机制可以很好地实现工厂模式,使程序更灵活、易于扩展。

1. 简单工厂模式(Simple Factory)

简单工厂不是严格意义上的设计模式,但它是理解工厂概念的良好起点。它通过一个工厂类根据传入的参数决定创建哪一种具体产品。

假设我们有一个图形绘制程序,需要创建不同的图形对象:

// 图形基类
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() {}
};

// 具体图形类
class Circle : public Shape {
public:
    void draw() override {
        // 绘制圆形
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        // 绘制矩形
    }
};

// 工厂类
class ShapeFactory {
public:
    enum ShapeType { CIRCLE, RECTANGLE };

    static Shape* createShape(ShapeType type) {
        switch (type) {
            case CIRCLE:
                return new Circle();
            case RECTANGLE:
                return new Rectangle();
            default:
                return nullptr;
        }
    }
};

使用方式:

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

Shape* shape = ShapeFactory::createShape(ShapeFactory::CIRCLE);
shape->draw();
delete shape;

2. 工厂方法模式(Factory Method)

工厂方法模式将对象的创建延迟到子类。每个具体工厂负责创建对应的具体产品,符合开闭原则。

定义抽象工厂接口:

class ShapeFactory {
public:
    virtual Shape* createShape() = 0;
    virtual ~ShapeFactory() = default;
};

// 具体工厂
class CircleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Circle();
    }
};

class RectangleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Rectangle();
    }
};

客户端代码:

XmxCms企业网站管理系统2.0
XmxCms企业网站管理系统2.0

原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可

下载
ShapeFactory* factory = new CircleFactory();
Shape* shape = factory->createShape();
shape->draw();
delete shape;
delete factory;

3. 抽象工厂模式(Abstract Factory)

当需要创建一组相关或依赖对象时,使用抽象工厂。例如,不同主题下的按钮和文本框。

// 按钮基类
class Button {
public:
    virtual void click() = 0;
    virtual ~Button() {}
};

class WinButton : public Button {
public:
    void click() override { / Windows风格点击 / }
};

// 文本框基类
class TextBox {
public:
    virtual void display() = 0;
    virtual ~TextBox() {}
};

class WinTextBox : public TextBox {
public:
    void display() override { / Windows风格显示 / }
};

// 抽象工厂
class GUIFactory {
public:
    virtual Button createButton() = 0;
    virtual TextBox
createTextBox() = 0;
    virtual ~GUIFactory() = default;
};

// 具体工厂:Windows风格
class WinFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new WinButton();
    }

    TextBox* createTextBox() override {
        return new WinTextBox();
    }
};

4. 使用智能指针优化内存管理

上面的例子使用了裸指针和手动 delete,容易出错。推荐使用智能指针避免内存泄漏。

修改返回类型为 std::unique_ptr:

#include

using ShapePtr = std::unique_ptr;

class ShapeFactory {
public:
    virtual ShapePtr createShape() = 0;
    virtual ~ShapeFactory() = default;
};

class CircleFactory : public ShapeFactory {
public:
    ShapePtr createShape() override {
        return std::make_unique();
    }
};

调用时无需手动释放资源,RAII 自动处理。

基本上就这些。工厂模式能有效分离对象创建与使用,提升代码可维护性。实际项目中结合配置或注册机制还能实现动态加载。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

538

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

422

2024.03.13

java多态详细介绍
java多态详细介绍

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

15

2025.11.27

java多态详细介绍
java多态详细介绍

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

15

2025.11.27

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2023.11.23

java中void的含义
java中void的含义

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

98

2025.11.27

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

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

1126

2023.10.19

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

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

192

2025.10.17

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.8万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号