单例模式
首先搞清楚一点,设计模式不是高深技术,不是奇淫技巧。设计模式只是一种设计思想,针对不同的业务场景,用不同的方式去设计代码结构,其最最本质的目的是为了解耦,延伸一点的话,还有为了可扩展性和健壮性,但是这都是建立在解耦的基础之上。
单例是为了保证系统中只有一个实例,其关键点有
一.私有构造函数
二.声明静态单例对象
三.构造单例对象之前要加锁(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.构造函数能否公有化?
不行,单例类的构造函数必须私有化,单例类不能被实例化,单例实例只能静态调用