单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。
单例模式的应用场景:有一些对象其实只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题。程序的行为异常,资源使用的过量,或者导致不一致的结果。常用来管理共享的资源,比如数据库的连接或者线程池。
“通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保护它唯一的实例。这个类可以保证没有其他实例可以被创建,并且它可以提供提供一个访问该实例的方法。DP”
singleton类,定义一个Getintance操作,允许访问它的唯一实例。Getintance是一个静态方法,主要负责创建自己的实例。
经典单件模式C++代码实现:
#include <iostream>
using namespace std;
//经典单例模式实现
class singleton{
public:
static singleton *GetInstance();
~singleton()
{
if(instance == NULL)
delete instance;
}
private:
static singleton *instance; //利用一个静态变量来记录Singleton的唯一实例
singleton();
};
singleton *singleton::instance = NULL; //静态成员变量初始化
singleton *singleton::GetInstance()
{
if(instance == NULL)
instance = new singleton();
return instance;
}
singleton::singleton()
{
}
int main()
{
singleton *singleObj = singleton::GetInstance();
delete singleObj;
return 0;
}
多线程的程序中,同时访问singleton类,调用GetInstance()方法,会有可能造成创建多个实例的。
singleton *singleton::GetInstance()
{
lock()
if(instance == NULL)
instance = new singleton();
unlock()
return instance;
}
互斥的同步会导致性能的降低,即使instance已经不为空了,每次还是需要加锁,这样操作花费就比较多,性能必定比较差。
通过“双重锁定”可以提升性能。方法如下:
在第一次创建的时候进行加锁,当instance不为空的时候就不需要进行加锁的操作
singleton *singleton::GetInstance()
{
if(instance == NULL){
lock();
if(instance == NULL)
instance = new singleton();
unlock();
return instance;
}
}