C++ 智能指针和工厂模式
智能指针和工厂方法模式
- 工厂方法模式
- 工厂模式实例
工厂方法模式
简单工厂模式虽然简单,但存在一个很严重的问题,当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式
- 日志记录器的设计
软件公司欲开发一个系统运行日志记录器,该记录器可以通过多种途径保存系统的运行日志,如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式,在设计各类日志记录器时,软件公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败;如何封装记录器的初始化过程并保证多种记录器切换的灵活性时软件公司开发人员面临的一个难题
该日志记录器有两个设计要点:
- 需要封装日志记录器的初始化过程,这些初始化工作较为复杂,例如需要初始化其他的类,还有可能需要读取配置文件,导致代码较长,如果将它们都卸载构造函数中,会导致构造函数庞大,不利于代码的修改和维护
- 用户可能需要更换日志记录方式,在客户端代码中需要提供一种灵活的方式来选择日志记录器,尽量在不修改源代码的基础上更换或者增加日志记录方式
工厂模式实例
这里使用了上一文章中的代码
C++ 智能指针: 链接.
//日志记录器接口:抽象产品
struct Logger
{virtual void writeLog() = 0;Logger() {cout << "日志记录器接口" << endl;}virtual ~Logger() //会先析构子类再析构基类{cout << "~Logger:" << endl;}
};//数据库日志记录器:具体产品
class DatabaseLogger :public Logger
{public:DatabaseLogger(){cout << "DatabaseLogger::" << endl;}~DatabaseLogger(){cout << "~DatabaseLogger::" << endl;}void writeLog() {cout << "数据库日志记录" << endl;}
};//文件日志记录器:具体产品
class FileLogger :public Logger
{public:FileLogger(){cout << "FileLogger::" << endl;}~FileLogger(){cout << "~FileLogger" << endl;}void writeLog(){cout << "文件日志记录" << endl;}
};//日志记录器工厂接口:抽象工厂
struct LoggerFactory
{virtual my_unique_ptr<Logger> createLogger() = 0;LoggerFactory(){cout << "LoggerFactory" << endl;}~LoggerFactory(){cout << "~LoggerFactory" << endl;}
};//数据库日志记录器工厂类:具体工厂
class DatabaseLoggerFactory :public LoggerFactory
{public:DatabaseLoggerFactory(){cout << "DatabaseLoggerFactory" << endl;}~DatabaseLoggerFactory(){cout << "~DatabaseLoggerFactory" << endl;}my_unique_ptr<Logger> createLogger(){//连接数据库,代码胜利//创建数据库日志记录器对象//Logger* logger = new DatabaseLogger();//初始化数据库日志记录器return my_unique_ptr<Logger>(new DatabaseLogger());//数据库日志记录器创建}
}; //文件日志记录器工厂类:具体工厂
class FileLoggerFactory :public LoggerFactory
{public:FileLoggerFactory(){cout << "FileLoggerFactory" << endl;}~FileLoggerFactory(){cout << "~FileLoggerFactory" << endl;}my_unique_ptr<Logger> createLogger(){return my_unique_ptr<Logger>(new FileLogger());}
};int main()
{my_unique_ptr<LoggerFactory> factory(new FileLoggerFactory());//文件日志记录器工厂my_unique_ptr<Logger> logger = factory->createLogger();logger->writeLog();factory.reset(new DatabaseLoggerFactory());logger = factory->createLogger();logger->writeLog();return 0;
}
最终对象的析构由智能指针进行操作,智能指针自动进行堆区空间的管理
而相对于C++为什么没有垃圾回收机制:
因为在程序的编写中,使用到了堆区的资源,但是由于应用场景与管理方式不同,C++可以根据业务需求去完成内存池的管理
C++ 智能指针和工厂模式相关推荐
- 智能家居 (4) ——工厂模式火焰报警
目录 工厂模式火焰报警部分代码 contrlEquipments.h 文件(设备类) mainPro.c 文件(主函数) fireDetection.c(火焰传感器) buzzer.c 文件(蜂鸣器) ...
- 智能家居(2) —— 工厂模式实现烟雾报警
目录 工厂模式实现烟雾报警 mainPro.c(主函数) controlDevice.h(设备类) smokeAlarm.c(烟雾报警器) buzzer.c(蜂鸣器) 运行结果 线程实现 mainPr ...
- 智能家居(1) —— 工厂模式引入工厂模式实现继电器控制
目录 一.什么是设计模式 二.类和对象 三.工厂模式 工厂模式的实现 四.工厂模式实现继电器控制 mainPro.c(主函数) controlDevice.h(设备类) bathroomLight.c ...
- 树莓派开发实战项目 智能家居--简单工厂模式(简单工厂模式介绍)
一.搭建模型 二.设计模式的概念引入 1.什么是设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是 ...
- 长虹智能电视进工厂模式方法汇总(遥控器有无数字按键均可)
一.适合新款带语音的遥控器 按[菜单]键后,当焦点移至"情景模式"下的"标准模式"菜单上时,按[上.右.右]组合键,弹出数字软键盘,当输入0816进入工厂菜单. ...
- 智能家居(工厂模式)
摘自:智能家居 作者:LEO-max 发布时间: 2021-03-05 00:38:07 网址:https://blog.csdn.net/zouchengzhi1021/article/detail ...
- 树莓派开发实战项目 智能家居--简单工厂模式(摄像头图片获取)
一.添加UVC驱动 有些程序采用V4L2编程,会访问到/dev/videoX设备,因此需要添加UVC驱动,针对树莓派3B/3B+可以采用如下的方法添加bcm2835-v4l2驱动: pi@raspbe ...
- 智能家居 (3) ——智能家居工厂模式介绍实现继电器控制灯
目录 智能家居工厂模式整体设计框架 继电器控制灯代码 contrlEquipments.h 文件(设备类) mainPro.c 文件(主函数) bathroomLight.c 文件(浴室灯) seco ...
- C++智能指针使用指南 part1:基本使用
加粗样式>@TOC 智能指针是代理模式的具体应用,它使用 RAII 技术代理了裸指针,能够自动释放内存, 无需程序员干预,所以被称为"智能指针". 智能指针不是指针,而是一个 ...
- 【C++】初识智能指针:智能在哪?
最近被指针折磨了一下,赶紧来学习一下智能指针,希望以后都可以用智能指针替换"裸指针",不要再自己去释放了. 一.什么是智能指针? 在说智能指针之前,先来看看"不智能指针& ...
最新文章
- shell编程--流程控制for,do-while,if-then,break,continue,case等
- linux 权限模式,Linux权限模式
- “城迷”:黑白梦与精神逃离
- Linux决心书/李世超
- netapp做内网穿透有问题
- 山东大学 2020级数据库系统 实验一
- mybatis-plus+springboot+vue+element-ui实现分页
- Linux 网卡流量查看
- 5、只出现一次的数字
- 视频教程-R语言实战之行业案例分享视频课程-其他
- python 规则引擎 drools_Drools 规则引擎环境搭建
- 2019最新Python学习教程_Python学习视频_Python学习路线:学Python,这次你可得认真看完了!
- 计算机科学本科科研经历,秦瑶:一名本科生的科研故事
- 我为账户和推广计划指定了不同的推广地域,以哪一个为准?
- [分类] Jzoj P1320 拯救奶牛
- 词性标注英文简称及分类
- 去除图片链接边框及其链接虚线
- 微信小程序如何封装api接口
- html5如何让多张图片重叠,HTML5图片层叠
- 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) -----(四)ESP430G2 低功耗模式