设计模式C++学习笔记之三(Singleton单例模式)
来源:互联网 发布:淘宝考试硬币戒指 编辑:程序博客网 时间:2024/06/05 14:24
设计模式C++学习笔记之三(Singleton单例模式)
单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。
3.1.解释
main(),大臣
CEmperor,需要单例的类
说明:很多大臣拜见的皇帝,只有一个。体现在面向对象方面,CEmperor定义一个静态指针,和一个静态函数,私有化构造函数、析构函数、构造函数复制、重载赋值语句。
注意:线程安全,采用互斥体的方式实现。
看代码:
//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++更吸引人们去研究,这就是软件研发的乐趣吧。
- 设计模式(c++)笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式学习笔记(一)之单例模式(Singleton)
- 设计模式C++之三(Singleton单例模式)
- 设计模式学习笔记—单例模式(Singleton)
- 设计模式实例(Lua)笔记之三(Singleton单例模式)
- 设计模式C++学习笔记之六(Singleton单例模式)
- C++设计模式之三--Singleton单例模式
- 设计模式(三)之Singleton - 单态模式
- 我的设计模式学习笔记------>单例模式(Singleton)
- 设计模式学习笔记——单例(Singleton)模式
- 设计模式学习笔记二(Singleton单件模式)
- 今日小结
- 单向链表逆转(递归)
- 黑马程序员—ADO.net复习基础篇3
- 汉诺塔算法
- LeetCode Spiral Matrix II
- 设计模式C++学习笔记之三(Singleton单例模式)
- window和ubuntu下的java环境配置
- POJ 1274 The Perfect Stall
- 纳米颗粒穿越胎盘屏障有玄机
- 【Java核心技术】Collections.sort对list进行排序
- 愿景
- 夜里睡前吃东西对身体有害(10点后别吃油腻的东西)
- GCC-C语言执行过程
- 浅谈持续集成