设计模式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单例模式)的更多相关文章
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- Django 学习笔记之三 数据库输入数据
假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...
- 【Visual C++】游戏编程学习笔记之三:游戏循环的使用
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...
- hive学习笔记之三:内部表和外部表
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- C#设计模式学习笔记:(1)单例模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8250985.html,记录一下学习过程以备后续查用. 一.引言 设计模式的分类: 1)依目的: 创建型(Cr ...
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 设计模式学习笔记c++版——单例模式
特别注意单例模式c++实现在main.cpp中引用的时候要去申明下: Singleton * Singleton::m_Instance = NULL; //定义性声明 不然会报错:无法解析的外部符号 ...
- 《javascript设计模式》读书笔记四(单例模式)
1.单利模式简单介绍 在<设计模式>中单利模式是一种比較简单的模式,定义例如以下: 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组 ...
- C++ 常用设计模式(学习笔记)
1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...
随机推荐
- 11、JDBC-Druid
依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- springboot中通用mapper结合mybatis generator的使用
通用mapper就是指的是 tk.mybatis 包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...
- (转)windows 下安装配置 Nginx 详解
windows 下安装配置 Nginx 详解 本文转自https://blog.csdn.net/kingscoming/article/details/79042874 nginx功能之一可以启动一 ...
- 编写高质量Python代码总结:待完成
1:字符串格式化 #避免%过多影响阅读 print('hello %(name)s'%{'name':'tom'}) #format方法print('{name} is very {emmition} ...
- BZOJ - 3676 回文串 (回文树)
https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s ...
- GIT与SVN的比较
Git: 1. 分布式版本控制2. 不需要网络,本地就可以操作版本控制3. 可以是公用的,可以分享4. 不依赖于中央服务器,即使服务器有问题也不会有影响5. 传输方式不一样,git要比svn快很多6. ...
- 064、Weave网络结构分析(2019-04-04 周四)
参考https://www.cnblogs.com/CloudMan6/p/7482035.html Weave网络使用之前需要执行 eval $(weave env) ,其作用是将后续的doc ...
- Immunity Debugger学习
1.Immunity Debugger简介 Immunity Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析.它具备一个完整的图形用户界面,同时还配备了迄今为止最为强 ...
- tensorflow 学习1——tensorflow 做线性回归
. 首先 Numpy: Numpy是Python的科学计算库,提供矩阵运算. 想想list已经提供了矩阵的形式,为啥要用Numpy,因为numpy提供了更多的函数. 使用numpy,首先要导入nump ...
- mysql常用命令及语法规范
mysql命令不区分大小写,函数和关键字建议使用大写字母,以分号结束语句. 显示当前服务器版本 SELECT VERSION(); 显示当前时间 SELECT NOW(); 显示当前用户 SELECT ...