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

工厂模式在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妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
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
virtual ~LoggerFactory() = default;
};
class FileLoggerFactory : public LoggerFactory {
public:
std::unique_ptr
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代码高亮与补全


2025-11-23
浏览次数:次
返回列表