新闻中心

C++怎么实现一个工厂模式_C++常用设计模式之Factory Method的应用

2025-11-23
浏览次数:
返回列表
Factory Method模式通过定义创建对象的接口,由子类决定实例化具体类,实现对象创建与使用的解耦。以日志系统为例,首先定义抽象产品Logger,声明write接口;接着实现FileLogger和ConsoleLogger等具体产品类,分别重写write方法以实现不同输出逻辑;然后定义工厂基类LoggerFactory,提供创建Logger的纯虚函数createLogger;再由FileLoggerFactory和ConsoleLoggerFactory等具体工厂类实现该方法,返回对应的日志对象;客户端仅依赖抽象工厂和产品接口,无需关心具体类型,从而实现灵活扩展与维护。

c++怎么实现一个工厂模式_c++常用设计模式之factory method的应用

工厂模式在C++中用于解耦对象的创建过程,让子类决定实例化哪一个类。它适用于需要根据不同的条件创建不同类型的对象,但又希望调用方无需关心具体类型的情况。Factory Method 模式是其中一种经典实现方式。

什么是Factory Method模式

Factory Method 模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这样,父类把对象的创建延迟到子类中完成,提高了扩展性。

核心思想是:把“创建对象”的逻辑封装起来,客户端只依赖抽象接口,不直接使用 new 创建具体类。

基本结构与代码示例

假设我们要设计一个日志系统,支持文件日志和控制台日志两种输出方式,通过工厂方法动态创建对应的日志处理器。

步骤一:定义产品接口

所有具体产品都继承自同一个基类:

Logger.h

class Logger {
public:
    virtual void write(const std::string& message) = 0;
    virtual ~Logger() = default;
};

步骤二:实现具体产品

FileLogger.h

class FileLogger : public Logger {
public:
    void write(const std::string& message) override {
        std::cout     }
};

ConsoleLogger.h

class ConsoleLogger : public Logger {
public:
    void write(const std::string& message) override {
        std::cout     }
};

步骤三:定义工厂接口

工厂基类声明一个创建产品的纯虚函数:

LoggerFactory.h

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多

class LoggerFactory {
public:
    virtual Logger* createLogger() = 0;
    virtual ~LoggerFactory() = default;
};

步骤四:实现具体工厂

每个具体工厂负责创建对应的具体产品:

FileLoggerFactory.h

class FileLoggerFactory : public LoggerFactory {
public:
    Logger* createLogger() override {
        return new FileLogger();
    }
};

ConsoleLoggerFactory.h

class ConsoleLoggerFactory : public LoggerFactory {
public:
    Logger* createLogger() override {
        return new ConsoleLogger();
    }
};

步骤五:客户端使用工厂

客户端通过工厂接口获取对象,无需知道具体类名:

int main() {
    LoggerFactory* factory = nullptr;
    std::string type = "file"; // 或 "console"

    if (type == "file") {
        factory = new FileLoggerFactory();
    } else {
        factory = new ConsoleLoggerFactory();
    }

    Logger* logger = factory->createLogger();
    logger->write("Test message");

    delete logger;
    delete factory;
    return 0;
}

改进:避免裸指针和内存泄漏

上面的例子用了 raw pointer 和 new/delete,容易出错。现代 C++ 推荐使用智能指针管理资源。

将工厂返回类型改为 std::unique_ptr:

class LoggerFactory {
public:
    virtual std::unique_ptr createLogger() = 0;
    virtual ~LoggerFactory() = default;
};

class FileLoggerFactory : public LoggerFactory {
public:
    std::unique_ptr createLogger() override {
        return std::make_unique();
    }
};

客户端代码更安全:

auto factory = std::make_unique();
auto logger = factory->createLogger();
logger->write("Safe with smart pointers");

适用场景与优点

Factory Method 适合以下情况:

  • 当一个类不知道它所必须创建的对象的类时
  • 希望子类决定创建哪个类的对象
  • 把对象创建的责任集中在一个地方,便于维护和替换

优点包括:

  • 降低耦合度:客户端不直接依赖具体类
  • 易于扩展:新增产品只需添加新工厂,符合开闭原则
  • 隐藏创建细节:客户端只关心接口行为

基本上就这些。使用 Factory Method 能有效组织对象创建逻辑,提升代码可维护性和灵活性。

以上就是C++怎么实现一个工厂模式_C++常用设计模式之Factory Method的应用的详细内容,更多请关注其它相关文章!


# 推荐使用  # SeO1O2  # 唐山营销推广厚街镇  # seo如何快速提升权重  # 栖霞区网站优化在线咨询  # 深圳龙岗seo公司  # seo市场现状分析  # 五原建设网站  # 美女网站建设平台  # 南京网站建设 雷仁网  # 长宁营销推广厂家地址查询  # 处理器  # 只需  # 两种  # 迭代  # 全局变量  # 不直接  # 如何使用  # 自定义  # 客户端  # 子类  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  实现全屏滚动与导航点:专业教程  steam官方网页快速访问 steam账号注册全流程  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  微信网页版登录教程_微信网页版登录入口在哪  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  实现分段式页面滚动导航:CSS与J*aScript教程  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  单射、满射与双射的关系 一文理清所有逻辑  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  快手官方唯一登录入口 谨防山寨钓鱼网站  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  J*aScript数组对象转换:按指定键分组与值收集  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  J*aScript中赋值与自增运算符的复杂交互与执行机制  优化Log4j2控制台输出性能:解决异步日志瓶颈  Composer如何在生产环境安全地执行composer update  Angular Material 垂直步进器:实现底部到顶部排序的教程  Golang指针如何与map组合使用_Golang map指针组合实践  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  快手赚钱渠道_快手收益来源  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  qq游戏免费畅玩入口_qq游戏电脑版快速启动  Go Martini框架:动态服务解码后的图片内容  漫蛙网页登录入口 漫蛙漫画官方授权网址  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  PDF文件体积过大处理_PDF压缩技巧详解  EMS快递官网app_中国邮政速递物流手机客户端  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  cad如何更改注释性对象的比例_cad注释性比例调整方法  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  如何在 Excel Online 和 Google 表格中更改日期格式  outlook中文官网入口地址 outlook官方中文版直达首页链接  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  在python-socketio事件处理器中安全访问Flask应用上下文  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  c++ dfs和bfs代码 c++深度广度优先搜索算法  深入理解J*a编译器的兼容性选项:从-source到--release  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全 

搜索