C++设计模式-单件模式-单件类

单件模式也称为单例模式或者单态模式,这是一种创建型模式,创建只能产生一个对象实例的类。

定义:单件(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;

}

猜你喜欢

转载自blog.csdn.net/bing_goo/article/details/128694262
今日推荐