当前位置: 首页 > news >正文

创建型模式-自注册工厂方法

创建型模式-自注册工厂方法

创建型模式-自注册工厂方法

目录
  • 创建型模式-自注册工厂方法
    • 1. 自注册工厂方法
      • 1.1 介绍
      • 1.2 实现
      • 1.3 优缺点
        • 优点
        • 缺点

002456-1721492696c292

那一天我二十一岁,在我一生的黄金时代,我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云,后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消逝,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。

《黄金时代》 王小波

文章大部分由AI生成

1. 自注册工厂方法

1.1 介绍

自注册工厂方法是一种创建型设计模式,它结合了工厂方法和自动注册机制。在这种模式中,派生类能够在程序启动时自动向工厂注册自己,无需手动维护创建映射表。这大大降低了扩展系统时的维护成本。

利用静态成员变量的初始化main 函数执行前完成注册的特性,实现自动注册。

1.2 实现

第 1 步:定义基类和工厂

class IAnim
{
public:virtual ~IAnim() = default;virtual QString getName() = 0;virtual void say() = 0;void done(){qDebug() << getName() << ": " ;say();}
};class UFactory
{using funcCreator = std::function<std::unique_ptr<IAnim>()>;
public:static UFactory& inst(){static UFactory s_u_factory;return s_u_factory;}void registerClass(const QString& id, funcCreator creator){auto iter = _mapId2CreateFunc.find(id);if (iter != _mapId2CreateFunc.end()){qDebug() << "已经注册了: 跳过" << id;}else{_mapId2CreateFunc[id] = std::move(creator);}}std::unique_ptr<IAnim> create(const QString& id){auto iter = _mapId2CreateFunc.find(id);if (iter != _mapId2CreateFunc.end()){return iter.value()();}qCritical() << "未注册 Id: " << id;return nullptr;}
private:UFactory() = default;UFactory(const UFactory&) = delete;UFactory& operator = (const UFactory&) = delete;private:QMap<QString, funcCreator>  _mapId2CreateFunc;
};

第 2 步:宏定义

#define REGISTER_CLASS(ClassName) \static bool ClassName##_registered = []() {         \UFactory::inst().registerClass(#ClassName,      \[]() -> std::unique_ptr<ClassName> {        \return std::unique_ptr<ClassName>(new ClassName());   \});                                         \return true;                                    \}();

第 3 步:定义子类

class UDog : public IAnim
{
public:virtual QString getName() override {return "Dog";}virtual void say() override {qDebug() << "Wang Wang...";}
};REGISTER_CLASS(UDog)class UCat : public IAnim
{
public:virtual QString getName() override {return "Cat";}virtual void say() override {qDebug() << "Miao Miao...";}
};
REGISTER_CLASS(UCat)

第 4步:使用

UFactory::inst().create("UDog")->done();
UFactory::inst().create("UCat")->done();已经注册了: 跳过 "UDog"
已经注册了: 跳过 "UCat"
"Dog" : 
Wang Wang...
"Cat" : 
Miao Miao...

1.3 优缺点

优点

优点 说明
扩展性好 新增类无需修改工厂代码,符合开闭原则
减少维护成本 无需手动维护注册映射表
配置驱动 可通过配置文件选择要创建的类
解耦 调用方只依赖基类和工厂,不依赖具体类
编译时检查 使用宏可以保证类型安全

缺点

缺点 说明
静态初始化顺序问题 跨编译单元的静态初始化顺序不确定,可能导致工厂在使用时未初始化
二进制膨胀 所有注册的类都会被链接进最终可执行文件
调试困难 静态初始化阶段的错误难以定位
依赖宏 需要宏辅助,可能影响代码可读性
类型名称冲突 使用类名字符串作为键,可能出现命名冲突
http://www.jsqmd.com/news/652451/

相关文章:

  • 【2026年】新大纲普通话考试真题题库50套(PDF电子版)
  • 高效拦截微信撤回消息的专业工具:WeChatIntercept完整指南
  • 魔兽争霸III终极优化指南:5个技巧让经典游戏焕发新生
  • 去掉 UWB / 蓝牙标签:浙江普陀时空大数据应用技术联合研究院无感定位,免穿戴、免部署、降本、全场景覆盖
  • LeetCode HOT100 - 合并两个有序链表
  • Hoppscotch:开源免费的Postman替代品,轻量级API测试神器
  • Unity UI布局核心:从RectTransform的localPosition与anchoredPosition看父子坐标系
  • TypeScript:路径映射(path mapping):简化导入路径
  • Navicat重置脚本终极指南:3种简单方法无限恢复试用期
  • 2026年国内AI营销领域综合实力3强机构深度分析与企业选型参考 - 商业小白条
  • 化妆培训机构师资实力解析,小白参考指南 - 品牌测评鉴赏家
  • 卖任何东西的6步故事框架
  • Moonlight串流全屏终极指南:iPad无边框设置详解
  • AES/SM4 对称加密算法原理以及上手
  • 伪孪生 vs 真空间:浙江普陀时空大数据应用技术联合研究院无感定位技术方案
  • VirtualBox 7.0 保姆级教程:手把手教你给Win10虚拟机装“显卡驱动”(增强功能详解)
  • 2026年昆明绘画机构排名前十 - 云南美术头条
  • 绕过 NX 保护的 Ret2libc 漏洞利用(CTFshow_Pwn25)
  • STM32F407 DAC实战:不写一行代码,用CubeMX图形化配置生成正弦波信号(含工程文件)
  • Beyond Compare 5密钥生成器:免费获取永久授权的完整教程
  • 影视剧组化妆培训学校大揭秘!你的梦想从这里起航 - 品牌测评鉴赏家
  • Qwen3-ForcedAligner-0.6B部署教程:镜像免配置一键启动音文对齐服务
  • 2026年东莞跨境美妆GEO优化服务商选型分析:3家专业机构推荐 - 商业小白条
  • 终极暗黑2存档编辑器指南:如何快速打造完美游戏角色
  • 美妆小白必看!揭秘专业化妆培训学校的宝藏选择 - 品牌测评鉴赏家
  • 深入剖析Redis删除策略:不止于惰性与定期
  • Messaging 数据库结构入门指南
  • 【THM-课程内容】:Privilege Escalation-Windows Privilege Escalation: Other Quick Wins
  • MCU驱动继电器的电路设计:从原理到实战避坑指南
  • Jasminum插件:中文文献管理的终极解决方案