//保证一个类仅有一个实例,同时提供能对该实例加以访问的全局访问方法。
//******************************************************************
class CSingle{
public:
//提供全局访问的访问点
static CSingle* GetInst();
private:
CSingle();//将构造函数设为私有属性
static CSingle* pInst;
//内部类,用于垃圾回收
class CDestroy{//全局静态变量,会被自动销毁,从而实现对单例的垃圾回收
public:
~CDestroy();
};
static CDestroy oDestroy;
class CLock{
private:
HANDLE hMutex;
public:
CLock();
~CLock();
void Lock();
void Unlock();
};
static CLock oLock;
};
CSingle::CLock::CLock(){ hMutex = CreateMutex(NULL, FALSE, NULL); }
CSingle::CLock::~CLock() { CloseHandle(hMutex);}
void CSingle::CLock::Lock(){ WaitForSingleObject(hMutex, INFINITE);}
void CSingle::CLock::Unlock(){ ReleaseMutex(hMutex);}
//******************************************************************
//提供全局访问的访问点
CSingle* CSingle::GetInst(){
//static CSingleton instance;return &instance;
if(NULL == pInst){
pInst = new CSingle(); printf("new pInst;\n");
}
return pInst;
}
CSingle::CSingle(){}//将构造函数设为私有属性
CSingle* CSingle::pInst = NULL;
//内部类,用于垃圾回收
CSingle::CDestroy::~CDestroy(){
if(pInst != NULL){//在这里销毁资源,比如数据库连接,句柄等。
oLock.Lock();
if(pInst != NULL){
delete pInst; pInst = NULL; printf("delete pInst;\n");
}
oLock.Unlock();
}
}
CSingle::CDestroy CSingle::oDestroy;
CSingle::CLock CSingle::oLock;
//客户端测试
void main()
{
CSingle* pInst1 = CSingle::GetInst();
CSingle* pInst2 = CSingle::GetInst();
printf("pInst1 = %p, pInst2 = %p. ", pInst1, pInst2);
}