【HeadFirst 设计模式】单例模式的C++实现

一、案例背景

书中给了一个巧克力工厂的例子,但是个人觉得关于单例模式书中给的例子过于简单,想要深入了解单例模式的小伙伴可以去看看这篇博客:【设计模式】单例模式的前世今生

二、案例分析

在很多时候,我们期望代码在运行过程中只实例化一个实例,听起来似乎很简单,但是你不应该想着仅靠个人技术或者团队内的约定去完成这件事。因为这件事从本质上讲是类的设计者的责任,而不能依靠使用这个类的人靠个人技艺去保证单例。单例模式是有发展历程的。最开始的一段时间,当人们设计出单例模式之后,这一模式便被广泛的使用,但随后有一些资深的计算机科学家论证了当时的编程手段实际上无法保证单例,再后来一些编程语言甚至增加了一些关键字去弥补这个漏洞。

三、代码实现

这里给出单例模式的相关案例:

cpp 复制代码
// 巧克力制造工厂
class ChocolateBoiler
{
private:
    bool boiled = false;
    bool empty  = true;

public:
    ChocolateBoiler()
    {
        init();
    }

    void init()
    {
        empty  = true;
        boiled = false;
    }

    static ChocolateBoiler* getInstance()
    {
        static ChocolateBoiler* instance = new ChocolateBoiler();
        return instance;
    }

    void fill()
    {
        // 锅炉为空时填充原料
        if (isEmpty())
        {
            empty  = false;
            boiled = false;
        }
    }

    void drain()
    {
        // 锅炉非空肯已经加热过,取出原料
        if (!isEmpty() && isBoiled())
        {
            empty = true;
        }
    }

    void boil()
    {
        // 加热原料,iff 非空且未加热
        if (!isEmpty() && !isBoiled())
        {
            boiled = true;
        }
    }

    const bool isEmpty() const
    {
        return empty;
    }

    const bool isBoiled() const
    {
        return boiled;
    }
};

int main(){
    ChocolateBoiler* boiler = ChocolateBoiler::getInstance();
    return 0;
}
相关推荐
钓鱼的肝3 小时前
梳理(1-5)
c++·经验分享·笔记·算法·青少年编程
jimy15 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
蒸蒸yyyyzwd5 小时前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
YYYing.5 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
钓鱼的肝7 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
重生的黑客7 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
Hespethorn7 小时前
取 `X-Forwarded-For` 首段做频控 key,等于把限流开关交给了调用方
c++
米糕闯编程7 小时前
鱼香ros2(七)功能包组织C++节点
c++·ros2·cmakelists
汉克老师7 小时前
GESP2026年9月认证C++四级( 第三部分编程题(1、新汉诺塔))精讲
c++·gesp·小学生·学c++编程
唠玖馆8 小时前
智能指针详解
c++