最近在学习设计模式,用的是 《Head First 设计模式》这本书。感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式。唯一有点不方便的地方是这本书的例子全都是用的 Java 来实现的。而我主要是用 C++。所以就动手将书上的代码用 C++ 来实现了一遍。

单例模式

单例模式相对比较简答,只要将类的构造函数搞成 private 就行了。

///ChocolateBoiler.h
#ifndef CHOCOLATEBOILER_H
#define CHOCOLATEBOILER_H

class ChocolateBoiler
{
public:
    void fill();
    void drain();
    void boil();
    bool isEmpty() {return m_empty;}
    bool isBoiled() {return m_boiled;}
    static ChocolateBoiler * getInstance();
private:
    ChocolateBoiler();
    bool m_empty;
    bool m_boiled;
    static ChocolateBoiler * m_instance;

};

#endif // CHOCOLATEBOILER_H
///ChocolateBoiler.cpp
#include "chocolateboiler.h"
#include <iostream>

using std::cout;
using std::endl;

ChocolateBoiler::ChocolateBoiler()
{
    m_empty = true;
    m_boiled = false;
}

void ChocolateBoiler::fill()
{
    if(isEmpty())
    {
        m_empty = false;
        m_boiled = false;
        cout << "ChocolateBoiler is filled" << endl;
        // other things
    }
}

void ChocolateBoiler::drain()
{
    if(!isEmpty() && isBoiled())
    {
        //
        m_empty = true;
        cout << "ChocolateBoiler is drained" << endl;
    }
}

void ChocolateBoiler::boil()
{
    if(!isEmpty() && !isBoiled())
    {
        m_boiled = true;
        cout << "ChocolateBoiler is boiled" << endl;
    }
}

ChocolateBoiler * ChocolateBoiler::m_instance = nullptr;

ChocolateBoiler * ChocolateBoiler::getInstance()
{
    if(!m_instance) // 如果用在多线程环境下,这里需要加锁
    {
        m_instance = new ChocolateBoiler;
    }
    return m_instance;
}

如果希望在程序一运行时就建立对象,可以这样写:

ChocolateBoiler * ChocolateBoiler::m_instance = new ChocolateBoiler;

ChocolateBoiler * ChocolateBoiler::getInstance()
{
    return m_instance;
}

这里用到的知识点就是 static 类型的变量是在程序运行的最开始初始化的。

《Head First 设计模式》例子的C++实现(5 单例模式)的更多相关文章

  1. php 设计模式 例子

    加载类:include("./Ren.class.php");include "./Ren.class.php"; require("./Ren.cl ...

  2. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  3. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  4. [Head First设计模式]一个人的平安夜——单例模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

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

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

  6. Java设计模式学习笔记,一:单例模式

    开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...

  7. JAVA设计模式详解(四)----------单例模式

    上一章我们学习了装饰者模式,这章LZ带给大家的是单例模式. 首先单例模式是用来干嘛的?它是用来实例化一个独一无二的对象!那这有什么用处?有一些对象我们只需要一个,比如缓存,线程池等.而事实上,这类对象 ...

  8. 设计模式php篇(一)————单例模式

    话不多说,直接上代码: <?php namespace DesignPattern; /** * php设计模式之单例模式 */ class SingleInstance { private s ...

  9. Python版设计模式: 创建型模式:单例模式和工厂模式家族

    一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...

  10. .net4.0设计模式(一)使用Lazy的单例模式

    延迟加载,亦称延迟实例化,延迟初始化等, 主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载.这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使 ...

随机推荐

  1. vue axios 发送post请求,后端接收参数为null

    1首先检查自己的传参方式是否正确,我是传一个对象,没有问题,接口也触发了 2查了下资料说是 Content-Type的问题,设置为   'application/x-www-form-urlencod ...

  2. OkHttp3源码详解(一) Request类

    每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...

  3. android recovery 升级之USB设备挂载

    Recovery升级过程,通常会从两个地方获取升级包update.zip升级,一般在线升级,会把升级包下载到cache分区,本地升级会从usb或者tf卡中升级.本文讨论下,本地USB升级时,无法挂载U ...

  4. [20171124]xxd与通配符.txt

    [20171124]xxd与通配符.txt --//linux 上许多命令都支持通配符,比如$ ls -l *.txt-rw-r--r-- 1 oracle oinstall 44801024 201 ...

  5. 基于 node 搭建博客系统(一)

    系统分为两端,分别实现. 管理员端: 功能 :个人信息,设置,发布随笔,随笔列表,删除随笔,查找,文章 等. 技术点:Boostrap + AdminLTE; 基于nodejs 实现的express ...

  6. python第九天----今天来晚了!

    作业 1. HAproxy配置文件操作1. 根据用户输入输出对应的backend下的server信息2. 可添加backend 和sever信息3. 可修改backend 和sever信息4. 可删除 ...

  7. 转:IIS 应用程序池 内存 自动回收

    原文地址:https://www.cnblogs.com/guohu/p/5209209.html IIS可以设置定时自动回收,默认回收是1740分钟,也就是29小时.IIS自动回收相当于服务器IIS ...

  8. tomcat 7.0 最大连接数和线程设置

    部署项目时需要根据服务器配置调整连接数 <Connector port="8080" protocol="HTTP/1.1"URIEncoding=&qu ...

  9. MonkeyRunner 之如何获取APP的Package Name和Activity Name

    别人写的就收藏了: MonkeyRunner 之如何获取APP的Package Name和Activity Name http://www.mamicode.com/info-detail-51278 ...

  10. 校园网下对VMware网络的配置

    1.参考:https://jingyan.baidu.com/article/8275fc8675c22646a03cf6b8.html 2.因为校园网的每一次连接都是自动获得IP地址的,所以虚拟机要 ...