单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客: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单例模式)相关推荐

  1. 《游戏设计模式》学习笔记

    ** <游戏设计模式>学习笔记 ** 原作中文版传送门:<游戏设计模式> 原书作者:Bob Nystrom 阅读背景:最近担任了主程(惭愧,整个项目组就我一个人,2333),在 ...

  2. linux系统管理学习笔记之三----软件的安装

    linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  3. C#设计模式(学习笔记[01])

    C#设计模式(学习笔记[01])<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...

  4. 学习笔记之三人表决器FPGA

    学习笔记之三人表决器FPGA 新手入门,多多包涵,不足错误之处,望指出 三人表决器,顾名思义就是三人投票,只要达到两票以上,就取胜. 设a,b,c为三个投票的人,输出的为f,投为1,不投为0,两票以上 ...

  5. 打印鸭子戏水java,《Head first设计模式》学习笔记 #8211; 策略模式,

    <Head first设计模式>学习笔记 – 策略模式, 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 假设有一个模拟鸭子的游戏,游 ...

  6. 2010年SQLite学习笔记之三

    2010年SQLite学习笔记之三 一.如何备份数据库 先打开数据库test.db E:/sqlite/tool/sqlite-3_6_22>sqlite3  D:/Test/debug/tes ...

  7. 《大话设计模式》学习笔记

    睡醒后就拿起<大话设计模式>这本书来看.之前对于设计模式只是一知半解,看了之后感觉受益匪浅. 在此做个小笔记.也强烈建议像我这样的萌新去看看.(很重要.很重要.很重要...) 前言 首先复 ...

  8. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  9. 秘籍:设计模式PDF学习笔记!

    周五晚上抽时间逛GitHub基本是常规例行操作,昨晚无意中看到一位GitHub大佬(https://github.com/fuzhengwei)的设计模式学习笔记,一时间语塞,瞬间嘴角微微上扬!有些小 ...

最新文章

  1. java 数组的基本操作
  2. C语言之归并排序算法
  3. MFC中GetDlgItemInt()方法的疑惑与使用总结
  4. Qt之QMetaObject::invokeMethod()使用简介
  5. 关于YoYo.Cms
  6. 华为机试HJ77:火车进站
  7. win10 Anaconda 安装教程
  8. python 元组和列表区别_Python基础教程,第三讲,列表和元组
  9. Linux 基础入门---常用命令
  10. Allegro走等长线设置
  11. 大数据七大岗位及职责
  12. PAT 乙级 1068 万绿丛中一点红 (20分)
  13. learning and evaluating representations for deep one-class classification
  14. 《CAT NAUGHTY CARP》App Store 隱私政策網址(URL)
  15. Android 获取蓝牙设备类型
  16. 不学好数学也想当数据科学家?不存在的
  17. 地区数据erea.js
  18. 利用selenium实现淘宝双十一抢购商品
  19. MySQL优化--整理
  20. 大连部分软件公司大概情况

热门文章

  1. IDEA导入Git项目后右键项目找不到Git选项的解决方法
  2. python 中关于无法导入自己写的类。解决方法
  3. java.io.FileNotFoundException异常,一是“拒绝访问”,二是“系统找不到指定路径”
  4. Hybrid App技术批量制作APP应用与跨平台解决方案
  5. SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob
  6. 使用内容脚本将代码插入页面上下文
  7. 如何使用JavaScript从字符串中删除空格?
  8. 严格的别名规则是什么?
  9. win11用户账户如何取消 windows11取消用户账户的设置方法
  10. C语言求一个文件的长度,求二进制文件的长度