c++设计模式二,单例模式

来源:互联网 发布:python re模块 小甲鱼 编辑:程序博客网 时间:2024/04/30 01:40

单例模式有点像QT的copy_on_write,很多大臣拜见的皇帝,只有一个。体现在面向对象方面,CEmperor定义一个静态指针,和一个静态函数,私有化构造函数、析构函数、构造函数复制、重载赋值语句。

就是很多个指针却指向的同一个内存。

emperor.h头文件

#ifndef EMPEROR_H#define EMPEROR_H#include <iostream>using std::cout;using std::endl;using std::string;class CGarbo{public:    CGarbo()    {        cout << "Create Garbo" << endl;    }    ~CGarbo()    {        cout << "Destroy Garbo" << endl;    }};class CEmperor{public:    static CEmperor * GetInstance();    static void ReleaseInstance();    void EmperorInfo(void);    void SetEmperorTag(string tag);private:    CEmperor(void);    virtual ~CEmperor(void);    CEmperor(const CEmperor&);    CEmperor& operator=(const CEmperor&);    static CEmperor *m_pEmperor;    string m_EmperorTag;    static CGarbo m_Garbo;};#endif // EMPEROR_H
emperor.cpp文件

#include "emperor.h"#include <iostream>using std::cout;using std::endl;using std::string;CEmperor* CEmperor::m_pEmperor = NULL;CEmperor::CEmperor(void){    cout << "Create CEmperor Instance" << endl;}CEmperor::~CEmperor(void){    cout << "Destroy CEmperor Instance and release its resource" << endl;}void CEmperor::EmperorInfo(void){    char msgBuffer[50] = { 0 };    sprintf_s(msgBuffer, 50, "皇ê帝?某3某3某3... ...(%s).", m_EmperorTag.c_str());    string msg(msgBuffer);    cout << msg.c_str() << endl;}CEmperor* CEmperor::GetInstance(){    if (NULL == m_pEmperor)    {        if (NULL == m_pEmperor)            m_pEmperor = new CEmperor();    }    return m_pEmperor;}void CEmperor::ReleaseInstance(){    if (NULL != m_pEmperor)    {        if (NULL != m_pEmperor)        {            delete m_pEmperor;            m_pEmperor = NULL;        }    }}void CEmperor::SetEmperorTag( string tag ){    m_EmperorTag = tag;}

main.cpp文件

#include <QCoreApplication>#include "emperor.h"#include <iostream>using std::cout;using std::endl;void DoIt(){    CEmperor *pEmperor1 = CEmperor::GetInstance();    pEmperor1->SetEmperorTag("95");    pEmperor1->EmperorInfo();    CEmperor *pEmperor2 = CEmperor::GetInstance();    pEmperor2->EmperorInfo();    CEmperor *pEmperor3 = CEmperor::GetInstance();    pEmperor3->EmperorInfo();    CEmperor *pEmperor4 = pEmperor3;    pEmperor4->EmperorInfo();    CEmperor *pEmperor5 = NULL;    pEmperor5 = pEmperor4;    pEmperor5->EmperorInfo();    CEmperor::ReleaseInstance();}int main(int argc, char *argv[]){DoIt();    return 0;}

结果都一样,都是95,所以是同一块内存。只是返回了他的指针。




原创粉丝点击