设计模式C++实现(4)——单例模式
来源:互联网 发布:百度云天空八部源码 编辑:程序博客网 时间:2024/06/11 13:25
单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。
UML图:
代码:
这里只有一个类,如何实现Singleton类的子类呢?也就说Singleton有很多子类,在一种应用中,只选择其中的一个。最容易就是在GetInstance函数中做判断,比如可以传递一个字符串,根据字符串的内容创建相应的子类实例。这也是DP书上的一种解法,书上给的代码不全。这里重新实现了一下,发现不是想象中的那么简单,最后实现的版本看上去很怪异。在VS2008下测试通过。
上面代码有一个地方很诡异,父类为子类的友元,如果不是友元,函数GetInstance会报错,意思就是无法调用SingletonA和SIngletonB的构造函数。父类中调用子类的构造函数,我还是第一次碰到。当然了把SingletonA和SIngletonB的属性设为public,GetInstance函数就不会报错了,但是这样外界就可以定义这些类的对象,违反了单例模式。
看似奇怪,其实也容易解释。在父类中构建子类的对象,相当于是外界调用子类的构造函数,因此当子类构造函数的属性为私有或保护时,父类无法访问。为共有时,外界就可以访问子类的构造函数了,此时父类当然也能访问了。只不过为了保证单例模式,所以子类的构造函数不能为共有,但是又希望在父类中构造子类的对象,即需要调用子类的构造函数,这里没有办法才出此下策:将父类声明为子类的友元类。
1 0
- 设计模式--单例模式 C++实现
- 设计模式——单例模式(c++)
- 设计模式——单例模式(C++)
- 设计模式C++实现4——单例模式
- 设计模式——单例模式(C++实现)
- AspectJ实现设计模式(六)—单例模式
- AspectJ实现设计模式(六)—单例模式
- 设计模式(C++) -----单例模式
- Objective-c 实现单例设计模式
- 设计模式—单例设计模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 设计模式C++实现(4)——单例模式
- 13计本2班安卓程序开发第二次实验单
- 揭开AssetBundle庐山真面目(一)
- 升级ruby版本遇到的一些问题
- 理解OAuth 2.0
- shell 进阶之内部变量的使用
- 设计模式C++实现(4)——单例模式
- 如何在本机编译openthos环境,适用与Ubuntu16.04
- GIT简单使用笔记
- C/C++中的内联函数和宏定义区别
- 揭开Unity AssetBundle庐山真面目(二
- sql语句中 时间数值转换为时间格式函数
- Android Studio 插件,一键生成 MVP 代码接口以及实现类。
- centos7 mysql数据库安装和配置
- POJ 3261 Milk Patterns(后缀数组[可重叠的k次最长重复子串])