带你深入浅出设计模式:一、单例模式,正确理解懒汉式和饿汉式

news2024/11/14 11:31:47

此为设计模式谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持

开始部分:

总:对于单例模式,在开发中通常用于设计配置信息类、数据库连接池、线程池等等,主要解决的问题是全局使用的类频繁地创建与销毁。

分:

1.为了更加好的理解单例模式,我们在vs中创建一个控制台项目

2.实现编码,这里使用了咖啡机作为一个例子

2.1 什么是懒汉式?

懒汉式就是需要的时候再创建然后使用。

2.2 什么是饿汉式?

饿汉式就是先创建,要用的时候立刻有的用。

#include <iostream>
using namespace std;

// 懒汉式咖啡机:在需要的时候才煮咖啡
class CoffeeMachineLazy {
private:
    CoffeeMachineLazy() {
        cout << "懒汉式咖啡机已准备好." << endl;
    }

public:
    // 静态成员函数,用于获取咖啡机的唯一实例
    static CoffeeMachineLazy* GetInstance() {
        if (instance == nullptr) {
            // 当咖啡机尚未准备时,创建并初始化它
            instance = new CoffeeMachineLazy;
        }
        return instance;
    }

private:
    // 静态成员变量,用于存放咖啡机的唯一实例
    static CoffeeMachineLazy* instance;
};

// 在类外部初始化静态成员
CoffeeMachineLazy* CoffeeMachineLazy::instance = nullptr;

// 饿汉式咖啡机:一开始就煮好咖啡
class CoffeeMachineEager {
private:
    CoffeeMachineEager() {
        cout << "饿汉式咖啡机已准备好." << endl;
    }

public:
    // 静态成员函数,用于获取咖啡机的唯一实例
    static CoffeeMachineEager* GetInstance() {
        // 立即返回已准备好的咖啡机实例
        return instance;
    }

private:
    // 静态成员变量,用于存放咖啡机的唯一实例
    static CoffeeMachineEager* instance;
};

// 在类外部初始化静态成员,咖啡机在程序开始时就已准备好
CoffeeMachineEager* CoffeeMachineEager::instance = new CoffeeMachineEager;

// 测试函数,用于验证咖啡机的实例是否唯一
void TestCoffeeMachine() {
    CoffeeMachineLazy* machine1 = CoffeeMachineLazy::GetInstance();
    CoffeeMachineLazy* machine2 = CoffeeMachineLazy::GetInstance();
    
    if (machine1 == machine2) {
        cout << "两台懒汉式咖啡机实例相同,单例模式有效." << endl;
    } else {
        cout << "两台懒汉式咖啡机实例不相同,不是单例模式." << endl;
    }

    CoffeeMachineEager* machine3 = CoffeeMachineEager::GetInstance();
    CoffeeMachineEager* machine4 = CoffeeMachineEager::GetInstance();
    
    if (machine3 == machine4) {
        cout << "两台饿汉式咖啡机实例相同,单例模式有效." << endl;
    } else {
        cout << "两台饿汉式咖啡机实例不相同,不是单例模式." << endl;
    }
}

int main() {
    cout << "程序开始运行." << endl;
    TestCoffeeMachine();
    cout << "程序运行结束." << endl;
    return 0;
}

总:根据此例子,我们可以发现单例模式有3个明显特点

单例类只能有一个实例对象;(构造函数设成私有化,不让用户自己创建对象)

单例类必须自己创建唯一实例;

单例类对外提供一个访问该单例的全局访问点。(唯一public接口设置为静态,用户直接类名进行访问)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2185474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A/D转换器的基本概念(分辨率+转换时间+采样定律+量化误差)+A/D转换方法(Flash(同步)型A/D转换器+计数型转换器)

2024-10-02&#xff0c;星期三&#xff0c;21:41&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。Hello&#xff0c;大家好啊&#xff0c;真的是好久没见了&#xff0c;上次更新还是在九月份&#xff0c;九月的最后一周出了一周的差&#xff0c;然后继续上了两…

代码随想录训练营Day19 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点

Leetcode 235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且…

【Nacos入门到实战三】安装Nacos Server:从零开始搭建配置中心

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

vue3项目如何添加属于自己的 live2d 看板娘 (支持换模型)

一、效果如下&#xff0c;想要更加效果前往我的博客 snows_ls BLOGhttp://124.223.41.220/ 资源我放这个仓库咯&#xff0c; 直接拉取即可 snows_l/live2d-sourcehttps://gitee.com/snows_l/live2d-source 二、引入&#xff08;看板娘出来了&#xff09; 直接在vue项目html中…

查找与排序-快速排序

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…

高效论文写作指南:那些你必须知道的工具与平台

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在完成论文写作过程中&#xff0c;有许多实用的工具和平台可以帮助提高效率、确保质量&#xff0c;并保持学术规范。以下是一些常用的论文写作工具和平台&#xff1a; 1. 文献管理工具…

数据网格:数据去中心化的特征

在现代的数据管理架构理念中&#xff0c;常常会谈及数据网格&#xff0c;将它用来解决大规模、复杂数据环境下的数据管理和利用问题。本文将探讨数据网格的概念以及数据去中心化和数据网格的紧密联系。 一数据网格 数据网格定义&#xff1a;数据网格将数据视为一种产品&#x…

中原台球展,2025郑州台球展会,中国台球产业链发展大会

阳春三月&#xff0c;万物复苏&#xff0c;商机无限&#xff1b;品牌宣传正当季&#xff0c;产品招商正当时&#xff0c;新品发布好时期。抓住台球发展的这波财富机遇&#xff0c;借助壹肆柒郑州台球展这个超级平台&#xff0c;将品牌和产品快速打造成为覆盖全国市场的顶流。20…

Acwing 简单博弈论

公平组合游戏ICG 若一个有限满足&#xff1a;由两名玩家交替行动&#xff1a; 在游戏进程的任意时刻&#xff1b;可以执行的合法行动与轮到哪名玩家无关&#xff1b;不能行动的玩家判负&#xff1b; 则称该游戏为一个公平组合游戏。NIM博弈属于公平组合游戏&#xff0c;但城建…

鸢尾花书实践和知识记录[编程1-11二维和三维可视化]

作者空间 文章目录 思维导图函数使用 二维可视化方案平面散点图散点图的示例代码1&#xff1a;绘制鸢尾花的散点图代码2Plotly绘制散点图 数据类型和绘图工具的对应 平面等高线代码3生成等高线网格数据 plotly.express关键的绘图函数 Plotly的另一个模块代码4 Plotly生成的 热图…

以旅游购物贸易方式报关出口的货物是什么意思

旅游购物贸易方式的定义 ‌旅游购物贸易‌是指国内外旅游者通过旅游渠道&#xff0c;携带外币现钞、外币票据入境&#xff0c;到外汇指定银行兑换成人民币&#xff0c;并在特定区域进行商品采购、报检、报关后&#xff0c;将所购货物运回国内进行销售的贸易行为。这种贸易方式通…

官方外卖霸王餐对接接口渠道如何选择?

对接官方外卖霸王餐接口渠道通常涉及以下步骤&#xff1a; 选择服务提供商&#xff1a;选择一个提供外卖霸王餐API接口服务的平台。注册与申请&#xff1a;在选定服务提供商的平台上进行注册并创建账号&#xff0c;然后提交API接口使用申请。获取接口文档和密钥&#xff1a;申…

CSS基础-常见属性

6、CSS三大特性 6.1 层叠性 如果样式发生冲突&#xff0c;则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素&#xff0c;优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…

SpringBoot框架下的社区医院信息系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理社区医院信息平台的相关信息成为必然。开发…

钢琴灯品牌排行榜前十名有哪些?护眼灯钢琴灯品牌排行榜

钢琴灯品牌排行榜前十名有哪些&#xff1f;要说近期比较火爆的家电产品&#xff0c;那一定绕不开护眼灯钢琴灯。作为能够提高光线质量&#xff0c;帮助我们营造舒适环境的热门好物&#xff0c;其受到了很多专业人士的认可。但是作为一名专业的家电测评师&#xff0c;我想在此提…

找到字符串中第一个匹配项的下标(c语言)

1./给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 //示例 1&#xff1a; //输入&#xff1a;haystac…

plt用数组显示图像

目录 plt.imshow实战 plt.imshow plt.imshow 可以用来显示二维数组表示的图像&#xff0c;也可以用来显示热图&#xff08;heatmap&#xff09;等。基本语法如下&#xff1a; plt.imshow(X, cmapviridis, interpolationnearest)参数说明&#xff1a; X&#xff1a;二维数组&…

基础岛第5关:XTuner微调个人小助手认知

进入开发机 克隆Tutorial仓库 mkdir -p /root/InternLM/Tutorialgit clone -b camp3 https://github.com/InternLM/Tutorial /root/InternLM/Tutorial 创建虚拟环境 在安装 XTuner 之前&#xff0c;我们需要先创建一个虚拟环境。使用 Anaconda 创建一个名为 xtuner0121 的虚拟…

工作日志:nvm版本控制遇到的一系列问题。

1、安装vue3可使用的富文本编辑器。&#xff08;https://www.wangeditor.com/v5/for-frame.html#demo-1&#xff09; npm install wangeditor/editor-for-vuenext --save2、为同时拥有两个类的元素设置样式&#xff0c;组合选择器是通过在选择器中并列写入两个类名来实现的&am…

openpnp - 执行M400命令后,超时错误的解决方法

文章目录 openpnp - 执行M400命令后&#xff0c;超时错误的解决方法概述笔记备注END openpnp - 执行M400命令后&#xff0c;超时错误的解决方法 概述 在X轴齿隙校正时&#xff0c;出现M400的命令超时错误。能重现。 查了资料&#xff0c;有人遇到过。看了github上的一个帖子(…