From 剑指Offer 何海涛 著

// 不好的解法一: 只适用于单线程环境
class Singleton1 {public:static Singleton1* getInstance(void) {if(instance == NULL) {instance = new Singleton1();}return instance;}private:static Singleton1 *instance;private:Singleton1(void) {}Singleton1(const Singleton1&);Singleton1& operator=(const Singleton1&);~Singleton1(void) {}class NestedClass {public:~NestedClass(void) {delete Singleton1::instance;Singleton1::instance =  NULL;}};static NestedClass justForSingleton; // 实现程序结束时, 释放 instance 占用的动态内存
};

// 不好的解法一(扩展): 只适用于单线程环境
class Singleton2 {public:static Singleton2& getInstance(void) {static Singleton2 instance; // 使用局部静态变量, 实现 instance 占用内存的释放return instance;}private:Singleton2(void) {}Singleton2(const Singleton2&);Singleton2& operator=(const Singleton2&);~Singleton2(void) {}};

// 可行的解法: 加同步锁前后两次判断实例是否存在
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
class Singleton1 {public:static Singleton1* getInstance(void) {if(instance == NULL) {pthread_mutex_lock(&mutex);if(instance == NULL) {instance = new Singleton1();}pthread_mutex_unlock(&mutex);}return instance;}private:static Singleton1 *instance;private:Singleton1(void) {}Singleton1(const Singleton1&);Singleton1& operator=(const Singleton1&);~Singleton1(void) {}class NestedClass {public:~NestedClass(void) {delete Singleton1::instance;Singleton1::instance =  NULL;}};static NestedClass justForSingleton;
};Singleton1* Singleton1::instance = NULL;

// 强烈推荐的解法: 利用静态成员变量
class Singleton3 {public:static Singleton3* getInstance(void) {return instance;}private:static Singleton3 *instance;private:Singleton3(void) {}Singleton3(const Singleton3&);Singleton3& operator=(const Singleton3&);~Singleton3(void) {}class NestedClass {public:~NestedClass(void) {delete Singleton3::instance;Singleton3::instance =  NULL;}};static NestedClass justForSingleton;
};Singleton3* Singleton3::instance = new Singleton3(); // 在程序开始时就会产生一个该类的实例,并在以后仅返回此实例

// 强烈推荐的的解法: 实现按需创建实例, 但这里并没有实现(C++中实现按需创建, 似乎只能借助于锁机制)
class Singleton4 {public:static Singleton4* getInstance(void) {return &NestedClass::instance; // 实例在进入主程序前已完成初始化}private:Singleton4(void) {}Singleton4(const Singleton4&);Singleton4& operator=(const Singleton4&);~Singleton4(void) {}class NestedClass {public:static Singleton4 instance;};
};
Singleton4 Singleton4::NestedClass::instance;

总结:

1. 程序在结束的时候,系统会自动析构所有的全局变量: 可以在类对象中添加一个静态类对象, 实现该类中静态变量占有的动态内存;

在单例类内部定义专有的嵌套类;
在单例类内定义私有的专门用于释放的静态成员;
利用程序在结束时析构全局变量的特性,选择最终的释放时机;
使用单例的代码不需要任何操作,不必关心对象的释放。

2. C++0X以后,要求编译器保证内部静态变量的线程安全性,可以不加锁。但C++ 0X以前,仍需要加锁, 实现线程安全性;

3. 静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。

参考:

http://blog.csdn.net/hackbuteer1/article/details/7460019

http://www.cnblogs.com/ccdev/archive/2012/12/19/2825355.html

转载于:https://www.cnblogs.com/long3216/p/4438819.html

{面试题2: 实现 Singleton 模式}相关推荐

  1. Android发展Singleton模式

    这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getIn ...

  2. Singleton模式笔记

    在C++中,尽量用Singleton替换全局变量是个很好的建议,Singleton一般如下: class  CSingleton { private:     static CSingleton* m ...

  3. java设计模式:Singleton模式

    Singleton模式是java中用到最多的设计模式.用于控制的个数,防止多余的实例化及修改.在仅有一个对象存在时,操作很有效. 1.构造函数私有化,其它类不能实例化对象 2.引用私有化,没有其它的修 ...

  4. Singleton模式学习

    动机(Motivation) 在软件系统中,经常有这样一些类,必须保证它们在系统中只存在一个类的实例,才能确保它们逻辑的正确性,以及良好的效率 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实 ...

  5. 细颗粒度Singleton模式实现

    作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...

  6. Design Pattern: Singleton 模式

    一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多 ...

  7. 剑指 offer set 28 实现 Singleton 模式

    singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...

  8. Singleton模式的实现

    1.实现Singleton模式 设计一个类,我们只能生成该类的一个实例. 2.低级解法一:只适用于单线程环境 因为我们只能生成一个实例,所以我们必须把构造函数设置为私有函数已禁止他人创建实例.可以定义 ...

  9. 人工智能——Singleton模式

    上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) {        deletem_pCurrentState; ...

最新文章

  1. Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用
  2. oracle 判断11位数字,45个非常有用的 Oracle 查询语句小结
  3. Loj 6485. LJJ 学二项式定理
  4. 博客开源系统(待续......)
  5. 读书笔记2013-1--暗时间(刘未鹏)
  6. 公众号出现该公众号提供的服务出现故障分析
  7. [Swift通天遁地]五、高级扩展-(4)快速生成Invert、Mix、Tint、Shade颜色及调整饱和度阶...
  8. springboot细节挖掘(知识积累)
  9. paip.提升用户体验---论文本编辑器的色彩方案
  10. dos命令之md详解及实例应用
  11. NB-LOT 常用AT指令集简介
  12. USB免驱接触式FM4442卡ISO7816读写器S3-BMU-A0函数使用规则
  13. uni-app 使用API中的uni.chooseImage 上传照片以及uni.previewImage图片预览(身份证照片为例)
  14. 2. 表的操作:创建表、修改表、列约束和表约束、数据操作、删除表
  15. SQL SERVER DAY函数
  16. wifi连接一段时间才能上网_Win7连接Wifi一段时间后就掉线的解决方法
  17. nordic 52832中添加RTT打印
  18. 1 还是 true ?
  19. 安装snmptraped 和 snmptt
  20. mysql非root用户密码,CenterOS 8上修改msql的root密码和新增非root用户步骤

热门文章

  1. 2015人脸检测研究进展
  2. 人脸识别技术大总结——Face Detection Alignment
  3. ADAS方案设计成功关键:图像处理技术
  4. 一文了解Kubernetes的前世今生
  5. WPF 将Bitmapsource转换到Emgu.cv.image
  6. docker run redis
  7. 数据关系模式设计的标准化
  8. CCF NOI1150 确定进制
  9. 用 Parser Combinator 解析 Cirru 的缩进语法
  10. 安装 m2eclipse 插件