设计模式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单例模式)相关推荐
- 《游戏设计模式》学习笔记
** <游戏设计模式>学习笔记 ** 原作中文版传送门:<游戏设计模式> 原书作者:Bob Nystrom 阅读背景:最近担任了主程(惭愧,整个项目组就我一个人,2333),在 ...
- linux系统管理学习笔记之三----软件的安装
linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
- C#设计模式(学习笔记[01])
C#设计模式(学习笔记[01])<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...
- 学习笔记之三人表决器FPGA
学习笔记之三人表决器FPGA 新手入门,多多包涵,不足错误之处,望指出 三人表决器,顾名思义就是三人投票,只要达到两票以上,就取胜. 设a,b,c为三个投票的人,输出的为f,投为1,不投为0,两票以上 ...
- 打印鸭子戏水java,《Head first设计模式》学习笔记 #8211; 策略模式,
<Head first设计模式>学习笔记 – 策略模式, 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 假设有一个模拟鸭子的游戏,游 ...
- 2010年SQLite学习笔记之三
2010年SQLite学习笔记之三 一.如何备份数据库 先打开数据库test.db E:/sqlite/tool/sqlite-3_6_22>sqlite3 D:/Test/debug/tes ...
- 《大话设计模式》学习笔记
睡醒后就拿起<大话设计模式>这本书来看.之前对于设计模式只是一知半解,看了之后感觉受益匪浅. 在此做个小笔记.也强烈建议像我这样的萌新去看看.(很重要.很重要.很重要...) 前言 首先复 ...
- .NET 云原生架构师训练营(设计原则设计模式)--学习笔记
▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...
- 秘籍:设计模式PDF学习笔记!
周五晚上抽时间逛GitHub基本是常规例行操作,昨晚无意中看到一位GitHub大佬(https://github.com/fuzhengwei)的设计模式学习笔记,一时间语塞,瞬间嘴角微微上扬!有些小 ...
最新文章
- java 数组的基本操作
- C语言之归并排序算法
- MFC中GetDlgItemInt()方法的疑惑与使用总结
- Qt之QMetaObject::invokeMethod()使用简介
- 关于YoYo.Cms
- 华为机试HJ77:火车进站
- win10 Anaconda 安装教程
- python 元组和列表区别_Python基础教程,第三讲,列表和元组
- Linux 基础入门---常用命令
- Allegro走等长线设置
- 大数据七大岗位及职责
- PAT 乙级 1068 万绿丛中一点红 (20分)
- learning and evaluating representations for deep one-class classification
- 《CAT NAUGHTY CARP》App Store 隱私政策網址(URL)
- Android 获取蓝牙设备类型
- 不学好数学也想当数据科学家?不存在的
- 地区数据erea.js
- 利用selenium实现淘宝双十一抢购商品
- MySQL优化--整理
- 大连部分软件公司大概情况
热门文章
- IDEA导入Git项目后右键项目找不到Git选项的解决方法
- python 中关于无法导入自己写的类。解决方法
- java.io.FileNotFoundException异常,一是“拒绝访问”,二是“系统找不到指定路径”
- Hybrid App技术批量制作APP应用与跨平台解决方案
- SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob
- 使用内容脚本将代码插入页面上下文
- 如何使用JavaScript从字符串中删除空格?
- 严格的别名规则是什么?
- win11用户账户如何取消 windows11取消用户账户的设置方法
- C语言求一个文件的长度,求二进制文件的长度