0

0

c++中怎么实现一个工厂模式_c++工厂设计模式实现方法

尼克

尼克

发布时间:2025-10-10 13:08:01

|

835人浏览过

|

来源于php中文网

原创

工厂模式通过解耦对象创建过程提升代码灵活性,C++中常用简单工厂、工厂方法、抽象工厂和注册式工厂四种方式实现,分别适用于不同复杂度与扩展需求场景。

c++中怎么实现一个工厂模式_c++工厂设计模式实现方法

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在C++中,通过基类指针和多态机制,结合一个“工厂”函数或类来决定具体创建哪个派生类对象,从而避免在代码中直接使用new编码对象类型。

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

简单工厂不是严格意义上的设计模式,但很实用。它用一个单独的工厂函数根据参数创建不同类型的对象。

示例:
#include 
#include 

// 基类
class Product {
public:
    virtual ~Product() = default;
    virtual void use() const = 0;
};

// 具体产品类
class ConcreteProductA : public Product {
public:
    void use() const override {
        std::cout << "Using Product A\n";
    }
};

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

// 工厂类(静态方法)
class SimpleFactory {
public:
    static std::unique_ptr createProduct(char type) {
        if (type == 'A') {
            return std::make_unique();
        } else if (type == 'B') {
            return std::make_unique();
        }
        return nullptr;
    }
};

使用方式:

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

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

下载
auto product = SimpleFactory::createProduct('A');
if (product) product->use(); // 输出:Using Product A

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

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使类的实例化延迟到子类。

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

// 工厂基类
class Factory {
public:
    virtual ~Factory() = default;
    virtual std::unique_ptr createProduct() const = 0;
};

// 具体工厂
class ConcreteFactoryA : public Factory {
public:
    std::unique_ptr createProduct() const override {
        return std::make_unique();
    }
};

class ConcreteFactoryB : public Factory {
public:
    std::unique_ptr createProduct() const override {
        return std::make_unique();
    }
};

使用方式:

std::unique_ptr factory = std::make_unique();
auto product = factory->createProduct();
product->use(); // 输出:Using Product A

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

用于创建一系列相关或依赖对象,而无需指定具体类。

// 产品族:另一个抽象产品
class Button {
public:
    virtual ~Button() = default;
    virtual void render() const = 0;
};

class WinButton : public Button {
public:
    void render() const override {
        std::cout << "Rendering Windows button\n";
    }
};

class MacButton : public Button {
public:
    void render() const override {
        std::cout << "Rendering Mac button\n";
    }
};

// 抽象工厂
class GUIFactory {
public:
    virtual ~GUIFactory() = default;
    virtual std::unique_ptr createProduct() const = 0;
    virtual std::unique_ptr

使用方式:

std::unique_ptr factory = std::make_unique();
auto product = factory->createProduct();
auto button = factory->createButton();
product->use();   // Using Product A
button->render(); // Rendering Windows button

4. 注册式工厂(Map + 函数指针)

更灵活的方式,通过注册类名与构造函数映射,实现动态扩展。

#include 
#include 

class ProductFactory {
public:
    using Creator = std::function()>;
    static ProductFactory& getInstance() {
        static ProductFactory instance;
        return instance;
    }

    void registerProduct(const std::string& name, Creator creator) {
        creators[name] = creator;
    }

    std::unique_ptr create(const std::string& name) {
        auto it = creators.find(name);
        return it != creators.end() ? it->second() : nullptr;
    }

private:
    std::map creators;
};

// 注册产品
static bool registerProducts() {
    ProductFactory::getInstance().registerProduct("A", []() {
        return std::make_unique();
    });
    ProductFactory::getInstance().registerProduct("B", []() {
        return std::make_unique();
    });
    return true;
}

static bool registered = registerProducts(); // 自动注册

使用方式:

auto product = ProductFactory::getInstance().create("A");
if (product) product->use(); // Using Product A
基本上就这些。选择哪种方式取决于需求:简单场景用简单工厂,需要扩展性时用工厂方法,处理产品族用抽象工厂,想支持插件式架构就用注册式工厂。

相关专题

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

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

15

2025.11.27

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

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

15

2025.11.27

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

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

1022

2023.10.19

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

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

65

2025.10.17

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

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

415

2025.12.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

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

33

2025.11.16

golang map原理
golang map原理

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

59

2025.11.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

42

2026.01.16

热门下载

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

精品课程

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

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.6万人学习

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

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