单例模式

首先搞清楚一点,设计模式不是高深技术,不是奇淫技巧。设计模式只是一种设计思想,针对不同的业务场景,用不同的方式去设计代码结构,其最最本质的目的是为了解耦,延伸一点的话,还有为了可扩展性和健壮性,但是这都是建立在解耦的基础之上。

单例是为了保证系统中只有一个实例,其关键点有

一.私有构造函数

二.声明静态单例对象

三.构造单例对象之前要加锁(lock一个静态的object对象)

四.需要两次检测单例实例是否已经被构造,分别在锁之前和锁之后

 

线程不安全

 1 class Singleton
 2 {
 3 public:
 4     static Singleton *GetInstance()        //关键点2:通过静态方法来构造对象
 5     {
 6         if (single == NULL)                //关键点3:判断单例对象是否已经被构造
 7         {
 8             single = new Singleton();    
 9         }
10         return single;
11     }
12 private:
13     static Singleton *single;            //关键点1:声明单例对象是静态的
14     Singleton() {}                        //关键点0:构造函数是私有的
15 };
16 Singleton * Singleton::single = NULL;

 

线程安全

 1 class Singleton
 2 {
 3 public:
 4     static Singleton *GetInstance()        //关键点2:通过静态方法来构造对象
 5     {
 6         if (single == NULL)                //关键点3:判断单例对象是否已经被构造
 7         {
 8             lock(obj)                    //关键点4:加线程锁
 9             {
10                 if (single == NULL)        //关键点5:二次判断单例是否已经被构造
11                 {
12                     single = new Singleton();
13                 }
14             }
15         }
16         return single;
17     }
18 private:
19     static Singleton *single;            //关键点1:声明单例对象是静态的
20     Singleton() {}                        //关键点0:构造函数是私有的
21 };
22 Singleton * Singleton::single = NULL;

0.为何要检测两次?

如上面所述,有可能延迟加载或者缓存原因,造成构造多个实例,违反了单例的初衷。

1.构造函数能否公有化?

不行,单例类的构造函数必须私有化,单例类不能被实例化,单例实例只能静态调用

posted @ 2018-03-21 10:43  hanhuihanhui  阅读(138)  评论(0编辑  收藏  举报