C++设计模式之单例模式


问题描述

现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的。在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错。但是,我所在的开发部门的C++编码规范是参照Google的编码规范的。

全局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不安全隐患,特别是在多线程程序中,会有很多的不可预测性;同时,使用全局变量,也不符合面向对象的封装原则,所以,在纯面向对象的语言Java和C#中,就没有纯粹的全局变量。那么,如何完美的解决这个日志问题,就需要引入设计模式中的单例模式。

单例模式

何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。意思很明白,使用UML类图表示如下。

UML类图

代码实现

单例模式,单从UML类图上来说,就一个类,没有错综复杂的关系。但是,在实际项目中,使用代码实现时,还是需要考虑很多方面的。

实现一:

C++中的RAII机制》。

模式扩展

在实际项目中,一个模式不会像我们这里的代码那样简单,只有在熟练了各种设计模式的特点,才能更好的在实际项目中进行运用。单例模式和工厂模式在实际项目中经常见到,两种模式的组合,在项目中也是很常见的。所以,有必要总结一下两种模式的结合使用。

一种产品,在一个工厂中进行生产,这是一个工厂模式的描述;而只需要一个工厂,就可以生产一种产品,这是一个单例模式的描述。所以,在实际中,一种产品,我们只需要一个工厂,此时,就需要工厂模式和单例模式的结合设计。由于单例模式提供对外一个全局的访问点,所以,我们就需要使用简单工厂模式中那样的方法,定义一个标识,用来标识要创建的是哪一个单件。由于模拟代码较多,在文章最后,提供下载链接。

总结

为了写这篇文章,自己调查了很多方面的资料,由于网上的资料在各方面都有很多的瑕疵,质量参次不齐,对我也造成了一定的误导。而这篇文章,有我自己的理解,如有错误,请大家指正。

由于该文对设计模式的总结,我认为比网上80%的都全面,希望对大家有用。在实际的开发中,并不会用到单例模式的这么多种,每一种设计模式,都应该在最适合的场合下使用,在日后的项目中,应做到有地放矢,而不能为了使用设计模式而使用设计模式。

工程下载



相关阅读:
JavaScript中使用ActiveXObject操作本地文件夹的方法
android照相、相册获取图片剪裁报错的解决方法
查看修改mysql编码方式让它支持中文(gbk或者utf8)
使用PHP和HTML5 FormData实现无刷新文件上传教程
三星笔记本(910S3K-K03)U盘装win7系统图文教程 三星笔记本u盘装win7
Javascript刷新窗口方法小结
jquery实现左右滑动菜单效果代码
微软正在内测win10 Build 10550版本 有望推送快速版
win10 Build 10108版本截图图赏:UI新的改进
Android实现将已发送的短信写入短信数据库的方法
c#委托学习示例分享
php实现MD5加密16位(不要默认的32位)
在Win10中回收站等桌面图标不见了怎么显示?
剖析标注HTML元素时class比id所具有的优势
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 2016三年级上学期寒假作业 党员服务中心工作制度 家人眼中的我 第一学年度体育委员工作总结 党校培训心得体会 2015机关信访工作总结 想飞的鸭子和被冻住脚的大雁作文1100字 公主的命运作文800字 生命中的第三个男人 退休干部给医院的感谢信 2013年三下乡社会实践活动日记 听邻女吟 减肥记作文200字 爸爸是槐花树上的月亮 清晨的校园作文500字 再见 再见 泰山 个人实习的工作总结 60岁祝寿贺词 实施"五大活动"推进新农村建设 高二语文教学反思 细雨偶感 被遗忘的父爱 你不知道的“生物黑客” 初中初一作文700字:寒假里去赚“钱” 作文 我喜爱的动物 小学五年级作文300字:读《爱在山野》有感 红薯看祖国变化 这种体验,应该存放在哪里 由一幅漫画所想到的作文400字 观后感作文1000字 以人为本 构建和乐校园 2015三言三实严于律己体会 在冰雪的日子里 祖国在我心中!作文 愚人节超整人的搞笑手机短信 六一儿童节少先队员发言稿 自勉 2015第几的教学反思 一件有趣的事开头 数学家的故事50字 小学想象作文700字:假如我生活在水果王国里 2013年电视台实习报告 中学生感恩演讲稿800字 玩螃蟹400字 儿童诗歌:是是非非 侯以雷诗歌欣赏1839 不一样的爱作文1000字 高中高一作文900字:爸爸、妈妈,我想对你说 11月思想汇报:服务的深层含义

Copyright © 2016 phpStudy |