单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。
3.1.解释
main(),大臣
CEmperor,需要单例的类
说明:很多大臣拜见的皇帝,只有一个。体现在面向对象方面,CEmperor定义一个静态指针,和一个静态函数,私有化构造函数、析构函数、构造函数复制、重载赋值语句。
注意:线程安全,采用互斥体的方式实现。
看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
//Emperor.h #pragma once #include <iostream> using std::cout; using std::endl; using std::string; 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; static HANDLE m_pMutex; string m_EmperorTag; class CGarbo { public: CGarbo() { cout << "Create Garbo" << endl; } ~CGarbo() { cout << "Destroy Garbo" << endl; if (NULL != m_pEmperor) { WaitForSingleObject(m_pMutex, INFINITE); if (NULL != m_pEmperor) { cout << "Remove instance" << endl; delete m_pEmperor; m_pEmperor = NULL; } ReleaseMutex(m_pMutex); } if (NULL != m_pMutex) { cout << "Delete mutex" << endl; CloseHandle(m_pMutex); m_pMutex = NULL; } } }; static CGarbo m_Garbo; }; //Emperor.cpp #include "StdAfx.h" #include "Emperor.h" #include <iostream> using std::cout; using std::endl; using std::string; CEmperor* CEmperor::m_pEmperor = NULL; HANDLE CEmperor::m_pMutex = CreateMutex(NULL, FALSE, NULL); CEmperor::CGarbo CEmperor::m_Garbo; 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) { WaitForSingleObject(m_pMutex, INFINITE); if (NULL == m_pEmperor) m_pEmperor = new CEmperor(); ReleaseMutex(m_pMutex); } return m_pEmperor; } void CEmperor::ReleaseInstance() { if (NULL != m_pEmperor) { WaitForSingleObject(m_pMutex, INFINITE); if (NULL != m_pEmperor) { delete m_pEmperor; m_pEmperor = NULL; } ReleaseMutex(m_pMutex); } } void CEmperor::SetEmperorTag( string tag ) { m_EmperorTag = tag; } //Singleton.cpp #include "stdafx.h" #include "Emperor.h" 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 _tmain(int argc, _TCHAR* argv[]) { DoIt(); _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); _CrtDumpMemoryLeaks(); return 0; } |
单例模式比较简单,但在项目中使用的时候,需要明确只调用CEmperor的GetInstance函数来获取实例。在C#里
有更简单的方法,那就是声明只读的静态变量,比C++简单多了。
但C++更吸引人们去研究,这就是软件研发的乐趣吧。
发表评论
要发表评论,您必须先登录。