c++怎么实现一个工厂模式_c++创建型设计模式实例讲解


定义抽象产品类Product,包含纯虚函数use;2. 实现具体产品ConcreteProductA和ConcreteProductB;3. 创建工厂类Factory,通过createProduct方法根据参数返回不同产品实例,实现对象创建与使用的分离。

工厂模式是创建型设计模式中非常常见的一种,它的核心思想是将对象的创建过程封装起来,让调用者无需关心具体类的实例化细节。在C++中,通过基类指针、虚函数和多态机制,可以很好地实现这一模式。下面以一个简单的例子说明如何用C++实现工厂模式。

1. 定义产品接口

首先定义一个抽象基类(产品接口),所有具体产品都继承自它。这个类通常包含一个或多个虚函数,用于定义产品的公共行为。

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

比如我们有两个具体产品:ConcreteProductA 和 ConcreteProductB。

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"; } };

2. 实现工厂类

工厂类负责根据输入参数创建不同的产品对象。它对外提供一个创建接口,内部决定实例化哪一个具体类。

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

使用示例:

int main() {
    Factory factory;
Product* product1 = factory.createProduct("A");
Product* product2 = factory.createProduct("B");

if (product1) {
    product1->use();  // 输出: Using Product A
    delete product1;
}

if (product2) {
    product2->use();  // 输出: Using Product B
    delete product2;
}

return 0;

}

3. 改进:避免内存泄漏

上面的例子中使用了 raw pointer 和 new/delete,容易造成内存管理问题。更现代的写法是返回智能指针。

#include 

class Factory { public: std::unique_ptr createProduct(const std::string& type) { if (type == "A") { return std::make_unique(); } else if (type == "B") { return std::make_unique(); } else { return nullptr; } } };

调用方式也更安全:

auto product1 = factory.createProduct("A");
if (product1) product1->use();

4. 扩展性与注册机制(可选高级技巧)

如果产品种类很多,可以在运行时动态注册构造函数,避免修改工厂代码。可以用函数映射实现:

class Factory {
    using Creator = std::function()>;
    std::map creators;

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

std::unique_ptrzuojiankuohaophpcnProductyoujiankuohaophpcn createProduct(const std::string& type) {
    auto it = creators.find(type);
    if (it != creators.end()) {
        return it-youjiankuohaophpcnsecond();
    }
    return nullptr;
}

};

// 使用时注册 Factory factory; factory.registerProduct("A", [](){ return std::make_unique(); }); factory.registerProduct("B", [](){ return std::make_unique(); });

这种方式支持后期扩展,符合开闭原则。

总结:C++中的工厂模式通过多态和封装解耦了对象创建与使用。结合智能指针能写出既安全又灵活的代码。基本结构包括抽象产品、具体产品和工厂类。对于大型项目,可引入注册机制提升可维护性。

基本上就这些。


# c++  # 封装  # 多态  # 构造函数  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # pointer  # delete  # 对象  # 中非  # 这一  # 很好  # 多个  # 可以用  # 可选  # 提供一个  # 如何用  # 也更 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】  LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现  如何有效拦截拼接式恶意域名的垃圾信息  网站体验不好=浪费钱:如何提升-用户体验效果差  手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】  mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】  Win11怎么设置开机密码_Windows11账户登录选项PIN码  用lighttpd能运行php吗_lighttpd配置php步骤【教程】  php做exe支持多线程吗_并发处理实现方式【详解】  php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】  VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】  Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】  短链接怎么用php递归还原_多层加密链接的处理法【详解】  如何解决Windows字体显示模糊的问题?(ClearType设置)  php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】  Python装饰器设计思路_功能增强机制说明【指导】  Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】  Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】  Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标  Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数  如何使用Golang反射创建map对象_动态生成键值映射  php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】  如何在包含多值的列中精准搜索指定演员?  c# 在高并发场景下,委托和接口调用的性能对比  Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】  php中$this和::能混用吗_对象与静态作用域冲突解决【方法】  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  PHP主流架构怎么集成Redis缓存_配置步骤【方法】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】  如何在Golang中实现WebSocket广播_使用Channel和协程分发消息  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  MAC怎么设置程序窗口永远最前_MAC窗口置顶插件安装与快捷设置【方法】  英国搜索:多数英国人认为语言搜索是未来搜索  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Win11怎么设置指纹解锁 Win11笔记本录入指纹登录【教程】  如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟  Go语言中slice追加操作的底层共享机制详解  Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】  Windows系统时间服务错误_W32Time服务修复与同步教学  C++友元类使用场景_C++类间协作设计方式讲解  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  如何使用Golang log设置日志输出格式_Golang log日志格式示例  Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】  Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案  Mac如何解压zip和rar文件?(推荐免费工具)  如何在 Go 中正确初始化结构体中的 map 字段  Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.