单件模式也称为单例模式或者单态模式,这是一种创建型模式,创建只能产生一个对象实例的类。
定义:单件(Singleton )模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
要点:
1. 为了防止外界调用产生多个实例,将构造方法、析构方法、拷贝构造方法、赋值重载方法都作为protected 。
2. instance() 方法产生对象方式有两种:使用局部static 对象,生命期在首次进入局部生命期产生,在程序结束时销毁;通过new 产生新对象,在析构方法中delete 对象。
3.获取单件实例调用方式:Singleton::instance() 获取对象指针。
4. 解决多线程资源竞争条件。使用著名的“双检测锁定”办法来解决,即在锁定前和锁定后都检测对象是否产生,这样既能保证加锁效率又能保证单件实例的唯一性。
应用:
//MainCtl.h
class CMainCtrl
{
public:
//支持单件类的相关函数
static CMainCtrl* GetInstance();
static void Destroy();
static void StopSignal(int lSig);
private:
static CMainCtrl* m_spMainCtrl;
//主控类构造函数和析构函数
CMainCtrl();
~CMainCtrl();
CMainCtrl(const CMainCtrl& temp);
CMainCtrl &operator=(const CMainCtrl& temp);
}
//该范例通过把类的构造函数封装为私有的,这样就无法在堆和栈上创建一个属于该类的对象了,只能通过调用静态成员函数GetInstance来生成对象,这样,下次在通过GetInstance函数生成这个对象的时候,这个对象还是之前的那个,这样就达到了我们的目的,既保证了这个类只会创建出一个属于该类的对象出来。
//MainCtl.cpp
CMainCtrl * CMainCtrl::m_spMainCtrl = NULL;
//支持单件类的相关函数
CMainCtrl * CMainCtrl::GetInstance()
{
if (NULL == m_spMainCtrl)
{
NEW(m_spMainCtrl, CMainCtrl);
}
return m_spMainCtrl;
}
void CMainCtrl::Destroy()
{
DELETE(m_spMainCtrl);
}
void CMainCtrl::StopSignal(int lSig)
{
if (NULL != m_spMainCtrl)
{
m_spMainCtrl->Stop();
}
}
int main()
{
CMainCtrl* p = CMainCtrl::GetInstance();
return 0;
}