单例模式
1.懒汉模式
GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针。
class CSingleton{
public:
static CSingleton* GetInstance(){
if (m_pInstance == nullptr)
m_pInstance = new CSingleton();
return m_pInstance;
}
~CSingleton(){};
private:
CSingleton(){};
Singleton(Singleton)=delete;//?????
Singleton operator=(const Singleton)=delete;//?????
static CSingleton* m_pInstance;
}
Singleton* Singleton::m_instance_ptr = nullptr;
线程安全的懒汉模式:
class Singleton{
public:
typedef std::shared_ptr<Singleton> Ptr;
~Singleton(){
std::cout<<"destructor called!"<<std::endl;
}
Singleton(Singleton&)=delete;
Singleton& operator=(const Singleton&)=delete;
static Ptr get_instance(){
// double checked lock
if(m_instance_ptr==nullptr){
std::lock_guard<std::mutex> lk(m_mutex);
if(m_instance_ptr == nullptr){
m_instance_ptr = std::shared_ptr<Singleton>(new Singleton);
}
}
return m_instance_ptr;
}
private:
Singleton(){
std::cout<<"constructor called!"<<std::endl;
}
static Ptr m_instance_ptr;
static std::mutex m_mutex;
};
2.饿汉模式
class CSingleton{
private:
CSingleton(){}
pubic:
static CSingleton* GetInstance(){
static CSingleton* instance;
return instance;
}
}
多线程模式下会出问题的,线程安全的饿汉模式如下:
class CSingleton
{
private:
static CSingleton* m_instance;
CSingleton(){}
public:
static CSingleton* getInstance();
};
CSingleton* CSingleton::getInstance()
{
if(NULL == m_instance)
{
Lock();//借用其它类来实现&#