博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++模式学习------单例模式
阅读量:6310 次
发布时间:2019-06-22

本文共 2474 字,大约阅读时间需要 8 分钟。

单例(Singleton)模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。例如一些类是属于工具,配置,日志性质的,程序很多的地方会用到,若每次都去new会增加了开销,也不好管理。这时候我们只需要一个实例对象就可以。这里是可以采用全局或者静态变量的方式,不过全局量没有封装,可能会有误用影响其他地方的情况。

 

Lazy Singleton 

1 class Singleton   2 {   3      public:   4         static Singleton& Instance()  5                   //使用的时候初始化单例 6         {   7             if(instance == NULL)                        8                 instance = new Singleton;   9              return *instance;                          10         }  11   12      private: //为实现单例,需要将构造,复制构造都设为私有13          Singleton();                                  14          ~Singleton();  15          Singleton(const Singleton&);  16          Singleton& operator=(const Singleton&);  17    18          static Singleton* instance;  19 };

【这种模式不是线程安全的。多线程运行的时候,构造会出现问题。在这种情况下,需要加上互斥锁,来实现线程安全】

1 class Singleton   2 {   3     public:   4         static Singleton& Instance()  5         {   6             if(instance== NULL)  //若未初始化则上锁初始化 7             {      8                 Lock();//上锁   9                 if(instance== NULL)   10                     instance= new Singleton;  11                 Unlock();//解锁  12             }  13             return *instance;   14         }     15   16     private:  //为实现单例需要将构造函数,复制构造函数设为私有17         Singleton();   18         ~Singleton();  19         Singleton(const Singleton&);  20         Singleton& operator=(const Singleton&);  21   22         static Singleton* instance;  23 };

 

 

 

 

Eager Singleton

1 class Singleton   2 {   3     public:   4         static Singleton& Instance()  5                   //用的时候返回单例 6         {   7             return instance;   8         }   9   10     private:  //为实现单例,需要将构造,复制构造都设为私有11         Singleton(); 12         ~Singleton();  13         Singleton(const Singleton&);  14         Singleton& operator=(const Singleton&);  15   16         static Singleton instance;  //构造的时候初始化17 };

【初始化的时候构造完成,因此是线程安全的】

 

Meyers Singleton

1 class Singleton   2 {   3     public:   4         static Singleton& Instance()   5                            //第一次使用的时候构造 6         {   7             static Singleton instance;   8             return instance;   9         }  10   11     private:  12         Singleton();  //  为实现单例,需要将构造复制构造设为私有13         ~Singleton();  14         Singleton(const Singleton&);  15         Singleton& operator=(const Singleton&);       16 };

【在c++11之后这种模式是线程安全的】

转载于:https://www.cnblogs.com/tyche116/p/8666224.html

你可能感兴趣的文章
插件:商品放大镜
查看>>
ubuntu部署使用pm2部署nodejs项目 + pm2和nginx开机自启动
查看>>
大学毕业,该去小公司,还是去大公司
查看>>
React性能优化 -- 利用React-Redux
查看>>
获取paymsgid
查看>>
SpringBoot 1024行代码 - Getting Started(一个简单的web应用)
查看>>
STL中常用函数
查看>>
zookeeper客户端的使用
查看>>
Angular4学习笔记之Angular CLI 安装和使用教程
查看>>
Java 代理模式与 AOP
查看>>
【5 kyu】Who Is Next?( Double Cola )
查看>>
2017-09-30 前端日报
查看>>
nodejs模块整理
查看>>
开发之路(设计模式六:命令模式下)
查看>>
spring-springmvc-mybatis项目介绍
查看>>
葡萄城报表V11 SP2新版本震撼发布!
查看>>
React结合webpack配置(2)
查看>>
「前端」weex页面传参
查看>>
Hive中常被忽视的利器——宏
查看>>
MVP - 收藏集 - 掘金
查看>>