单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
当例模式一般分为两种,一种是饿汉式单例,采取静态初始化的方式,它是由类一加载就实例化的对象,所以要提前占用系统资源。
class final Singleton
{
private:
Singleton(){};//构造函数声明为private,让外界无法利用new创建实例。
static Singleton singleton;
public:
Singleton* GetInstance()
{
return singleton;
}
}
饿汉式单例模式采用的是用空间换时间的方式。
另外一种是懒汉式单例:
class Singleton
{
private:
static Singleton *instance;
Singleton(){};
public:
static Singleton *GetInstance()
{
if(instance==NULL)
instance=new Singleton();
return instance;
}
}
懒汉式单例除了可以生成唯一实例之外,还可以严格的控制客户怎样访问以及何时访问,是一种用时间换空间的方式。
懒汉式单例模式无法保证线程安全性,调用GetInstance()可能生成多个实例。因此在多线程中需要进行加锁保护。
class Singleton
{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
if(NULL == m_instance)
{
lock();
if(NULL == m_instance)
{
m_instance = new Singleton;
}
unlock();
}
return m_instance;
}