单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客: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. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  2. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  3. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  4. hive学习笔记之三:内部表和外部表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. C#设计模式学习笔记:(1)单例模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8250985.html,记录一下学习过程以备后续查用. 一.引言 设计模式的分类: 1)依目的: 创建型(Cr ...

  6. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  7. 设计模式学习笔记c++版——单例模式

    特别注意单例模式c++实现在main.cpp中引用的时候要去申明下: Singleton * Singleton::m_Instance = NULL; //定义性声明 不然会报错:无法解析的外部符号 ...

  8. 《javascript设计模式》读书笔记四(单例模式)

    1.单利模式简单介绍 在<设计模式>中单利模式是一种比較简单的模式,定义例如以下: 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组 ...

  9. C++ 常用设计模式(学习笔记)

    1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...

随机推荐

  1. Dubbo优雅关机原理

    Dubbo是通过JDK的ShutdownHook来完成优雅停机的 所以如果用户使用 kill -9 PID 等强制关闭命令,是不会执行优雅停机的 只有通过 kill PID时,才会执行 原理: · 服 ...

  2. expdp和impdp导入导出用法【转】

    关于expdp和impdp exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.expdp和impdp是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.i ...

  3. 【1】【leetcode-33,81】 搜索旋转排序数组

    (没思路) 33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给 ...

  4. 转---变量LEGB规则

    Python 变量作用域的规则是 LEGB LEGB含义解释: L -- Local(function):函数内的名字空间 E -- Enclosing function locals:外部嵌套函数的 ...

  5. Spring Bean的ref属性和IoC注入集合

    这是一个Demo 1.Phone.java package com.cn.pojo; public class Phone { private String name; private double ...

  6. [译]使用NuGet管理共享代码

    原文 可以在内网部署自己的私人NuGet仓储服务. Setting it up 本例中我们创建一个发邮件的类,将其作为我们自己的NuGet包: using System; using System.N ...

  7. 使用PHP连接数据库实现留言板功能

    PHP实现留言板功能: 1 首先是登录页面: <!DOCTYPE html><html>    <head>        <meta charset=&qu ...

  8. luogu P4389 付公主的背包

    传送门 神仙题鸭!orz dkw 暴力就是完全背包 而完全背包可以和生成函数扯上关系,记第i种物品质量为\(a_i\),那么这种物品的生成函数\(G(i)=\sum_{j=0}^{\infty}x^{ ...

  9. 第25月第22日 django channels

    1. https://github.com/andrewgodwin/channels-examples/ https://channels.readthedocs.io/en/latest/

  10. Kotlin数据模型

    Java中的常用的Bean类,每一个变量我们都需要写getter,setter方法,却都要手动实现很多方法: 尽管可以用工具帮我们完成,但是代码显得很臃肿,不灵活. 特别是当我们需改其中某一个成员的时 ...