C++之单例模式
1、C++单例模式的概念及作用
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
2、单例模式的实现原理
(1)私有静态指针变量实现:使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。
(2)静态局部变量实现:在公有静方法中定义指向该类的一个静态局部变量,并返回该静态局部变量。
3、单例模式的实现代码
(1)
//私有静态指针变量实现
class Singleton { private: Singleton() //构造函数是私有的 { } static Singleton *pInstance; public: static Singleton * GetInstance() { if(pInstance == NULL) //判断是否第一次调用 pInstance = new Singleton(); return pInstance; } };
(2)
//静态局部变量
class Singleton { private: Singleton() //构造函数是私有的 { } public: static Singleton & GetInstance() { static Singleton instance; //局部静态变量 return &instance; } };
4、扩展
a) 把构造函数设为私有,禁用赋值和复制。带来的问题:main中无法随意生成对象
b) 提供一个static函数绕过构造函数为private的限制。问题:对象不唯一。
c) 设置一个static指针,每次先判断是否为NULL。此时实现了一个简单的单例模式。但是此时在多线程环境下不唯一。
d) 引入互斥锁,实现对getInstance内临界区的互斥访问。此时每次调用都需要上锁,导致效率下降。
e) 采用double check模式,使得不必每次调用都需要加锁,提高了效率。
5、DCLP(double-check-locking-pattern)
class Singleton { public: static Singleton *getInstance() { if(pInstance_ == NULL) { mutex_.lock(); if(pInstance_ == NULL) //线程的切换 pInstance_ = new Singleton; mutex_.unlock(); } return pInstance_; } private: Singleton() { } static Singleton *pInstance_; static MutexLock mutex_; };