全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++怎么实现工厂设计模式_c++ 抽象工厂与对象动态创建【案例】

直接new无法满足多态创建需求,因其将具体子类类型硬编码在调用点,违反开闭原则;工厂模式通过封装new逻辑、依赖抽象类型,实现运行时动态创建。

为什么直接 new 不能满足多态创建需求

当业务需要根据配置、用户输入或运行时条件决定创建哪种子类对象时,硬编码 new DerivedA()new DerivedB() 会把具体类型写死在调用点,破坏开闭原则。后续每新增一个子类,都得改所有创建逻辑——这是工厂模式要解决的核心问题。

  • 抽象基类(如 Shape)定义接口,不负责实例化
  • 工厂类(如 ShapeFactory)封装 new,只暴露统一创建接口
  • 调用方只依赖工厂和抽象类型,完全不知道具体子类名

简单工厂:用字符串/枚举控制 new 哪个子类

适合子类数量固定、创建逻辑不复杂的情况。它不是 GoF 23 种之一,但最常用、最易理解。

class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() = default;
};

class Circle : public Shape {
public:
    void draw() override { std::cout << "Drawing Circle\n"; }
};

class Rectangle : public Shape {
public:
    void draw() override { std::cout << "Drawing Rectangle\n"; }
};

class ShapeFactory {
public:
    static std::unique_ptr create(const std::string& type) {
        if (type == "circle") return std::make_unique();
        if (type == "rectangle") return std::make_unique();
        throw std::runtime_error("Unknown shape type: " + type);
    }
};
  • 返回 std::unique_ptr 而非裸指针,避免内存泄漏
  • 工厂方法是 static,调用无需实例化工厂对象
  • 错误类型名会直接抛出异常,调用方必须处理,不能静默失败

抽象工厂:创建一族相关对象,比如不同主题的 UI 控件

当系统需要创建多个有内在关联的对象(如 Button + Checkbox),且这些对象需保持风格一致(Windows 风 vs macOS 风),抽象工厂就派上用场。

class Button { public: virtual void render() = 0; };
class Checkbox { public: virtual void render() = 0; };

class WindowsButton : public Button { void render() override { std::cout << "Win button\n"; } };
class MacOSButton : public Button { void render() override { std::cout << "Mac button\n"; } };

class WindowsCheckbox : public Checkbox { void render() override { std::cout << "Win checkbox\n"; } };
class MacOSCheckbox : public Checkbox { void render() override { std::cout << "Mac checkbox\n"; } };

class GUIFactory {
public:
    virtual std::unique_ptr
  • 每个具体工厂(WindowsFactory)保证返回的对象属于同一“族”,避免混搭
  • 客户端代码只依赖 GUIFactory 接口,通过传入不同工厂实例切换整套 UI 风格
  • 新增主题只需加一对具体类 + 一个工厂子类,不修改已有代码

动态创建:从字符串名自动 new 对象(需注册机制)

C++ 没有 Java 的 Class.forName(),要实现“根据类名字符串创建对象”,必须手动注册构造函数指针。

using CreatorFunc = std::unique_ptr(*)();
std::map g_creatorMap;

template
void registerCreator(const std::string& name) {
    g_creatorMap[name] = []() -> std::unique_ptr {
        return std::make_unique();
    };
}

// 初始化时注册
void initFactories() {
    registerCreator("circle");
    registerCreator("rectangle");
}

std::unique_ptr createShape(const std::string& name) {
    auto it = g_creatorMap.find(name);
    if (it != g_creatorMap.end()) return it->second();
    throw std::runtime_error("No creator registered for: " + name);
}
  • 注册必须在 main() 开始前完成(可用静态变量触发)
  • 模板函数 registerCreator 避免重复写 lambda,提升可读性
  • 若类名来自配置文件或网络,务必校验 name 是否存在于 g_creatorMap,否则崩溃

抽象工厂本身不解决“字符串到类型”的映射,那是简单工厂或注册表的职责;真正关键的是:谁持有创建逻辑、谁承担变化——这决定了你该选哪种工厂结构。


# go  # 编码  # c++  # 为什么  # Java  # Static  # 封装  # 多态  # 子类  # 构造函数  # checkbox  # 字符串  # Lambda  # 指针  # 接口  # class  # 对象  # windows  # macos  # ui  # 哪种  # 的是  # 这是  # 开闭  # 那是  # 多个  # 已有  # 只需 


相关文章: 东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何构建满足综合性能需求的优质建站方案?  建站上传速度慢?如何优化加速网站加载效率?  建站之星如何防范黑客攻击与数据泄露?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  建站之星导航配置指南:自助建站与SEO优化全解析  建站之星2.7模板快速切换与批量管理功能操作指南  如何在七牛云存储上搭建网站并设置自定义域名?  企业微网站怎么做,公司网站和公众号有什么区别?  如何在搬瓦工VPS快速搭建网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何制作网站标识牌,动态网站如何制作(教程)?  宁波自助建站系统如何快速打造专业企业网站?  MySQL查询结果复制到新表的方法(更新、插入)  建站之星代理费用多少?最新价格详情介绍  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何在西部数码注册域名并快速搭建网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在腾讯云服务器快速搭建个人网站?  制作营销网站公司,淘特是干什么用的?  北京网站制作网页,网站升级改版需要多久?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何在Golang中引入测试模块_Golang测试包导入与使用实践  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  建站之星如何修改网站生成路径?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  h5在线制作网站电脑版下载,h5网页制作软件?  名字制作网站免费,所有小说网站的名字?  大连 网站制作,大连天途有线官网?  宝塔建站助手安装配置与建站模板使用全流程解析  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何访问已购建站主机并解决登录问题?  如何通过wdcp面板快速创建网站?  建站之星安装后如何配置SEO及设计样式?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  建站之星后台管理系统如何操作?  如何通过老薛主机一键快速建站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  建站主机与服务器功能差异如何区分?  如何选择高效便捷的WAP商城建站系统?  建站之星如何一键生成手机站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  广州美橙建站如何快速搭建多端合一网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何快速生成凡客建站的专业级图册?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  如何自定义建站之星模板颜色并下载新样式? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。