单例模式
class Singleton
{
public:
static Singleton& Instance()
{
static Singleton instance;
return instance;
}
private:
Singleton(){}
};
重用
如果现在好几个类型都需要实现为Singleton,较为流行的宠用方法一共有三种:组合、派生以及模板。首先,对Singleton的重用仅仅是对Instance()函数的重用,因此通过从Singleton派生以继承该函数的实现是一个很好的选择。而Instance()函数如果能根据实际类型更改返回类型则更好了。因此奇异递归模板(CRTR)模式是一个非常好的选择。
template <typename T>
class Singleton
{
public:
static T& Instance()
{
static T& s_Instance;
return s_Instance;
}
protected:
Singleton(void){}
~Singleton(void){}
private:
Singleton(const Singleton& rhs){}
Singleton& operator=(const Singleton& rhs){}
};
多线程
template <typename T>
class Singleton
{
public:
static T& Instance()
{
if(m_pInstance == NULL)
{
Lock lock;
if(m_pInstance == NULL)
{
m_pInstance = new T();
atexit(Destory);
}
return *m_pInstance;
}
return *m_pInstance;
}
protectd:
Singleton(void){}
~Singleton(void){}
private:
Singleton(const Singleton& rhs){}
Singleton& operator= (const Singleton& rhs){}
void Destory()
{
if(m_pInstance != NULL)
delete m_pInstance;
m_pInstance = NULL;
}
static T* m_pInstance;
};
template <typename T>
T* Singleton<T>::m_pInstance = NULL;
REF:
https://www.cnblogs.com/loveis715/archive/2012/07/18/2598409.html(Singleton单例模式)