单例模式分为两种:一种为懒汉模式(顾名思义就是比较懒,需要的时候采取初始化一个对象),饿汉模式(一开始就全局初始化),其中懒汉模式又分为两种,类内局部静态变量和加锁判空的方式。
方法一:懒汉模式 指针初始化
//Begin 单例懒汉模式 指针初始化/
class Singleton
{
private:
Singleton(){};
static Singleton* instance;
static mutex mt;
public:
static Singleton* getInstance();
};
//静态数据成员需要在类外部进行定义和初始化
Singleton* Singleton::instance = NULL;
mutex Singleton::mt;
Singleton* Singleton::getInstance()
{
if (instance == NULL) //两重的加锁判断是为了避免该对象已经完成创建 但获取的时候还总是需要等待锁的低效
{
mt.lock();
if (instance == NULL)
{
instance = new Singleton();
}
mt.unlock();
}
return instance;
}
//End 单例懒汉模式 指针初始化/
方式二、懒汉模式——局部静态数据成员
//Begin 单例懒汉模式 局部静态数据成员//
class Singleton2
{
private:
Singleton2(){};
public:
static Singleton2* getInstance();
};
Singleton2* Singleton2::getInstance()
{
static Singleton2 theInstance; //和全局静态数据成员一样 只能被初始化一次
return &theInstance;
}
//End 单例懒汉模式 局部静态数据成员//
方式三、饿汉模式——全局静态对象
//Begin 单例饿汉模式 指针
class Singleton3
{
private:
Singleton3(){};
static Singleton3* pinstance; //定义一个静态的指针
//static Singleton3 instance; //定义一个静态的成员 可以使用的基础是因为静态成员变量可以是非完全类型
public:
static Singleton3* getInstance();
static Singleton3* getOtherInstance();
};
Singleton3* Singleton3::pinstance = new Singleton3(); //在全局的时候就完成初始化,这里的构造函数能够调用因为在Singleton3的作用域之内
//Singleton3 Singleton3::instance; //在全局时候完成初始化
Singleton3* Singleton3::getInstance()
{
return pinstance;
}
Singleton3* Singleton3::getOtherInstance()
{
return &instance;
}
//End 单例饿汉模式 指针