#《Head First 设计模式》例子的C++实现(4 单件模式)

单件模式使用场景比较多。基本的实现要点就是将构造函数设为私有的,这样就不能随便生成变量了。

下面是一个简单的代码示例,没有考虑多线程情况。
ChocolateBoiler 类也不希望别人拷贝,所以也把拷贝构造函数设为私有了。另外 C++与 java 最大的不同是 C++ 需要自己处理资源释放问题。所以还需要个 releaseInstance() 函数。


class ChocolateBoiler
{
public:void boil();bool isEmpty();bool isBoiled();void fill();void drain();
static ChocolateBoiler& getInstance();
static void releaseInstance() {delete m_uniqueInstance; m_uniqueInstance = nullptr;}
private:ChocolateBoiler();ChocolateBoiler(ChocolateBoiler &cb){}bool m_empty;bool m_boiled;static ChocolateBoiler * m_uniqueInstance;
};ChocolateBoiler * ChocolateBoiler::m_uniqueInstance = nullptr;ChocolateBoiler::ChocolateBoiler()
: m_empty(true), m_boiled(false)
{}ChocolateBoiler& ChocolateBoiler::getInstance()
{if (m_uniqueInstance == nullptr){std::cout << "Creating unique instance of Chocolate Boiler" << std::endl;m_uniqueInstance = new ChocolateBoiler();}std::cout << "Returning instance of Chocolate Boiler" << std::endl;return *m_uniqueInstance;
}
void ChocolateBoiler::boil()
{std::cout << this << " : boil" << std::endl;if (!isEmpty() && !isBoiled()){// bring the contents to a boilm_boiled = true;}
}bool ChocolateBoiler::isEmpty()
{return m_empty;
}bool ChocolateBoiler::isBoiled()
{return m_boiled;
}void ChocolateBoiler::fill()
{std::cout << this << " : fill" << std::endl;if (isEmpty()){m_empty = false;m_boiled = false;// fill the boiler with a milk/chocolate mixture}
}
void ChocolateBoiler::drain()
{std::cout << this << " : drain" << std::endl;if (!isEmpty() && isBoiled()){// drain the boiled milk and chocolatem_empty = true;}
}

测试代码如下:

    ChocolateBoiler& boiler = ChocolateBoiler::getInstance();boiler.fill();boiler.boil();boiler.drain();ChocolateBoiler& boiler2 = ChocolateBoiler::getInstance();boiler2.fill();boiler2.boil();boiler2.drain();ChocolateBoiler::releaseInstance();ChocolateBoiler& boiler3 = ChocolateBoiler::getInstance();boiler3.fill();boiler3.boil();boiler3.drain();

输出结果如下:

Creating unique instance of Chocolate Boiler
Returning instance of Chocolate Boiler
0000028A02ED4F40 : fill
0000028A02ED4F40 : boil
0000028A02ED4F40 : drain
Returning instance of Chocolate Boiler
0000028A02ED4F40 : fill
0000028A02ED4F40 : boil
0000028A02ED4F40 : drain
Creating unique instance of Chocolate Boiler
Returning instance of Chocolate Boiler
0000028A02ED4F80 : fill
0000028A02ED4F80 : boil
0000028A02ED4F80 : drain

如果利用局部静态变量的特性。上面的代码还可以精简:

ChocolateBoiler& ChocolateBoiler::getInstance()
{static ChocolateBoiler cb;return cb;
}

这样 releaseInstance() 也不需要了。而且也不用考虑多线程加锁问题了。

《Head First 设计模式》例子的C++实现(4 单件模式)相关推荐

  1. [设计模式] 设计模式面面观(3):单件模式(Singletion)-创建型模式

    模式分类    载自 : http://blog.csdn.net/fanweiwei/article/details/1794804 从目的上来看 Ø       创建型模式 负责创建对象,封装对象 ...

  2. C#面向对象设计模式第二讲:Singleton Pattern单件模式(创建型模式)

    (根据MSDN Webcast相关课程整理) 模式分类: 从目的来看: 创建型(Creational):负责对象的创建 结构型(Structural):处理类与对象间的组合 行为型(Behaviora ...

  3. 《Head First设计模式》第五章笔记-单件模式

    单件模式 定义:确保一个类只有一个实例,并提供全局访问点. 编写格式: 1 2 3 4 5 6 public class MyClass{     private MyClass(){}//构造方法私 ...

  4. .NET设计模式(2):单件模式(Singleton Pattern)

    转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...

  5. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  6. 设计模式C++实现(8)——代理模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  7. 设计模式C++实现(6)——建造者模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  8. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  9. .NET设计模式(7):创建型模式专题总结(Creational Pattern)

    概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...

最新文章

  1. c#程序设定使用期限_C# 给某个方法设定执行超时时间
  2. 中台辨析:架构的演进趋势
  3. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth
  4. Hermite曲线与Bezier曲线的关系
  5. DFT - Introduction to Test Models
  6. 基于CAD/CAM的三维控件
  7. TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric
  8. 《Spring实战》第一章 — Spring之旅
  9. python基础案例教程_Python基础教程 两个经典案例:阶乘和幂
  10. 24. jQuery 细节
  11. 快排-Python实现
  12. Winform 开发用户控件
  13. 6.S081 Xv6 Lab 4 traps
  14. 《如何成为一个会学习的人》
  15. Steam显示-118错误,页面无法显示
  16. 供应链金融管理系统-汇新云
  17. 松翰单片机定时器c语言,松翰T0 定时器中断
  18. 最伟大IT人物10强出炉 乔布斯第一盖茨第三
  19. 想要成为黄金分析师要具备哪些知识?
  20. 紫色店铺商家信息后台管理模板

热门文章

  1. Java框架学习笔记--Mybatis学习
  2. 2020对口高考计算机专业分数线,2020高考分数线(分数线及一分一段表)
  3. 如何将安防摄像头接入互联网直播服务器
  4. 51单片机c语言程序执行顺序,51单片机程序执行流程详细分析
  5. Scikit-Learn入门教程
  6. 人工智能行业每日必读(02·04)
  7. python画大对勾_多种方法告诉你!Word如何在方框中打对勾√和叉叉×
  8. Android开发——网络请求(一)网络请求的API、授权和方法
  9. 微信小程序上传图片后 开发者工具自动刷新问题
  10. 大数据 (三) BI报表系统 superset 2 制作表格