尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

现代C++对象工厂模式实现解析

现代C++对象工厂模式实现解析
📅 发布时间:2026/6/19 10:30:52

View Post

现代C++对象工厂模式实现解析

这篇文章将介绍一个基于现代C++特性的对象工厂实现方案,该方案采用了模板元编程和静态注册技术,为创建对象提供了灵活且类型安全的机制。

核心设计理念

这个工厂模式实现包含三个关键组件:

  1. ObjectFactory模板类‌:通用的工厂基类,提供对象注册和创建功能
  2. AutoRegister辅助类‌:自动注册具体产品类的工具类
  3. REGISTER_PRODUCT宏‌:简化注册过程的语法糖


技术亮点

  1. 类型安全‌:通过模板参数确保产品类型匹配
  2. 自动注册‌:利用静态变量初始化实现零配置注册
  3. 内存管理‌:使用shared_ptr自动管理对象生命周期
  4. 单例模式‌:Meyer's singleton保证静态数据安全初始化
  5. 简洁接口‌:提供清晰的工厂API(register/create/clear)

代码

#include <functional>
#include <map>
#include <memory>template<class AbstractProduct, class ProductID = std::string>
class ObjectFactory
{
public:using ProductPtr = std::shared_ptr<AbstractProduct>;using Builder = std::function<ProductPtr()>;static void registerBuilder(const ProductID& id, Builder builder){getBuilders().insert_or_assign(id,builder);}template<typename ConcreteProduct,typename... Args>static void registerBuilder(const ProductID& id){registerBuilder(id,[](){return std::make_shared<ConcreteProduct>();});}static ProductPtr create(const ProductID& id){auto it = getBuilders().find(id);return it != getBuilders().end() ? it->second() : nullptr;}static void clear(){getBuilders().clear();}
private:static std::unordered_map<ProductID, Builder>& getBuilders(){static std::unordered_map<ProductID, Builder> instance;return instance;}
};template<class AbstractProduct, class ConcreteProduct, class ProductID = std::string>
class AutoRegister
{
public:explicit AutoRegister(const ProductID& id){ObjectFactory<AbstractProduct,ProductID>::template registerBuilder<ConcreteProduct>(id);}
};#define REGISTER_PRODUCT(AbstractType, ConcreteType, id) \namespace\{ \AutoRegister<AbstractType, ConcreteType> auto_reg_##ConcreteType(id); \}

使用方式

using namespace std;class Animal
{
public:virtual void say() = 0;
};class Cat : public Animal
{
public:Cat(){}void say(){std::cout<<"i am cat"<<std::endl;}
private:
};class Dog : public Animal
{
public:void say(){std::cout<<"i am dog"<<std::endl;}
};REGISTER_PRODUCT(Animal, Cat,"Cat")
REGISTER_PRODUCT(Animal, Dog,"Dog")int main()
{auto animal1 = ObjectFactory<Animal,std::string>::create("Cat");animal1->say();auto animal2 = ObjectFactory<Animal,std::string>::create("Dog");animal2->say();return 0;
}

 

相关新闻

  • 2025 年射线防护服生产厂家最新推荐排行榜:覆盖 X 射线 / 医用 / 中子射线防护服及防护裙、防护屏等品类,为医疗安检领域精选优质品牌
  • 在 VS Code 中集成 LaTeX 环境并创建第一个文档
  • Ai元人文:思想的归乡——从悟空之眼到未来哪吒

最新新闻

  • 2026赢客网络综合实力风云榜,价格透明口碑推荐不踩雷 - mypinpai
  • 商用车电泳漆品牌哪家靠谱 2026年市场口碑解析 - 品牌排行榜
  • OpCore Simplify:10分钟搞定黑苹果配置的智能工具终极指南
  • MC68HC912BD32串行通信与Byteflight协议深度解析
  • Switch虚拟Amiibo终极指南:免费解锁游戏隐藏内容
  • 2026年初中毕业学西点推荐好的学校用户力荐 - mypinpai

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号