单例(Singleton)模式:控制某个类只能自行生成一个可供外部全局访问的实例。例如:Windows的窗口管理器或者任务管理器都是只有一个实例
(http://c.biancheng.net/view/8385.html)
- 懒汉模式
- 特点是延迟加载,直到用到的时候才会加载
- 非线程安全,需要考虑多线程问题
#include <string>
#include <stdio.h>
//Lock 和 unLock借用其它类来实现,如boost
void Lock(){}
void unLock(){}
//线程安全版本懒汉模式
class CSingleton
{
public:
static CSingleton* GetInstance();
static void ReleaseInstance();
private:
CSingleton(){};
~CSingleton(){};
static CSingleton* m_pInstance;
};
CSingleton* CSingleton::m_pInstance;
CSingleton* CSingleton::GetInstance()
{
if (m_pInstance)
{
Lock();
if ( m_pInstance == NULL )
{
m_pInstance = new CSingleton();
}
unLock();
}
return m_pInstance;
}
void CSingleton::ReleaseInstance()
{
Lock();
if ( m_pInstance != NULL )
{
delete m_pInstance;
}
unLock();
}
CSingleton *s_Singleton = NULL;
int main()
{
//程序开始前加载
s_Singleton = CSingleton::GetInstance();
//程序结束后释放
CSingleton::ReleaseInstance();
return 0;
}
- 饿汉模式
- 特点是开始就创建了实例,所以每次用到的之后直接返回就好了
- 天生线程安全
#include <string>
#include <stdio.h>
//饿汉模式天生线程安全
class CSingleton
{
public:
static CSingleton* GetInstance();
private:
CSingleton(){};
~CSingleton(){};
static CSingleton instance;
};
CSingleton CSingleton::instance;
CSingleton* CSingleton::GetInstance()
{
return &instance;
}
CSingleton *s_Singleton = NULL;
int main()
{
s_Singleton = CSingleton::GetInstance();
return 0;
}