单例模式的饿汉和懒汉写法(基于C++)

news2024/9/23 5:30:04

目录

  • 单例模式
  • 例程
    • 饿汉
    • 懒汉
  • 对比
    • 函数调用
    • 线程安全
    • 总结


单例模式

单例模式确保一个类只有一个实例,并提供全局访问点。这样可以避免在系统中出现多个相同的对象,从而提高系统的性能和可维护性。
单例模式的实现包括饿汉和懒汉,下面介绍C++中这两种方式的写法。

例程

饿汉

饿汉模式是在程序启动前创建实例。
下面是一个全局计数器的示例。
counter.h

class Counter
{
public:
    static void plus(int number);
    static void print();

private:    //method
    Counter();

private:    //member
    static Counter counter;
    int value { 0 };
};

counter.cpp

#include "counter.h"
#include <iostream>

using namespace std;

Counter::Counter()
{
    cout << "init Counter" << endl;
}

Counter *Counter::instance()
{
	return &counter;
}

void Counter::plus(int number)
{
    counter.value += number;
}

void Counter::print()
{
    cout << counter.value << endl;
}

调用

#include "counter.h"

int main()
{
    cout << "program run" << endl;
    Counter::plus(5);
    Counter::print();
    
    return 0;
}

在这里插入图片描述

懒汉

懒汉模式是在第一次获取实例时调用。
同样是刚刚的例子。
counter.h

class Counter
{
public:
    static Counter* instance();
    void plus(int number);
    void print();

private:    //method
    Counter();

private:    //member
    int value{ 0 };
};

counter.cpp

#include "counter.h"
#include <iostream>

using namespace std;

Counter* Counter::instance()
{
    static Counter* counter = NULL;
    if (counter == NULL)
        counter = new Counter;
    return counter;
}

Counter::Counter()
{
    cout << "init Counter" << endl;
}

void Counter::plus(int number)
{
    value += number;
}

void Counter::print()
{
    cout << value << endl;
}

调用

#include "counter.h"

int main()
{
    cout << "program run" << endl;
    Counter::instance()->plus(5);
    Counter::instance()->print();
    
    return 0;
}

在这里插入图片描述

对比

通过上面的例子我们可以看到,饿汉模式和懒汉模式有以下区别。

函数调用

Counter::plus(5);
Counter::print();

Counter::instance()->plus(5);
Counter::instance()->print();

懒汉需要经过实例化函数instance()才能调用方法,饿汉不需要,显然饿汉模式更方便客户端的使用,且效率更高。

线程安全

懒汉是获取实例时才实例化,存在一个线程安全的问题:主线程和子线程同时调用instance()。显然这是不安全的,所以如果这个单例是多线程共享的,那还要加锁,进一步地降低了效率。

总结

通过以上对比,一般来说饿汉会比懒汉要好一些,但如果需要加载的单例很多,耗时比较长,这时候可以考虑使用懒汉。

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

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

相关文章

操作系统基础知识之处理器性能方程指标(包含阿达姆定律、CPI、Clock cycle time等)

计算机设计人员通过持续时间或速率来指代时钟周期的时间。程序的 CPU 时间可以用两种方式表示&#xff1a; CPU 时间程序的 CPU 时钟周期 / 时钟频率 除了执行程序所需的时钟周期数外&#xff0c;我们还可以计算执行的指令数。 如果我们知道时钟周期数和指令数&#xff0c;就…

金融学第二版笔记第一章1.1

第1部分 金融和金融体系 第一章金融学 1.1 一、 对金融学进行界定 1.金融 金融是货币流通、信用活动及与之相关的经济行为的总称。 简言之&#xff0c;就是货币资金的融通。一般是指以银行、证券市场等为中心的货币流通和信用调节活动&#xff0c;包括货币的发行和流通、存…

转置卷积(一) 搞懂转置卷积的计算

搞懂转置卷积的计算 0、参考文档1、转置卷积是什么&#xff1f;1.1 定义1.2 需要注意 2、转置卷积的计算2.1 从最简单的开始2.2 考虑stride2.3 考虑padding2.4 考虑dilation 3 转置卷积的加速 文章首发于https://zhaodongyu-ak47.github.io/Transposed_Convolution/ 最近做了一…

数据结构入门-二叉树

树的概念及结构 树的概念 树的一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它树根朝上&#xff0c;而叶子朝下。 有一个特殊的节点&#xff…

Web安全行业:零基础学习网络安全需要掌握哪些知识?(附系统路线+工具笔记)

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

单元测试 - 集成H2 Dao测测试

SpringBoot 2.7、Mybatis plus、H2 1. pom引入h2 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version> </dependency> 2. 配置h2数据源 & mapper路径 spring:datas…

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

( 位运算 ) 260. 只出现一次的数字 III ——【Leetcode每日一题】

❓260. 只出现一次的数字 III 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额…

精炼计算机网络——数据链路层(一)

文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 总结 前言 上篇文章&#xff0c;我们一同学完了物理层的全部内容&#xff0c;在本篇文章中&#xff0c;我们初步学习数据链路层&#xff0c;理解数据链路和帧的相应概念&#xff0c;知晓封装成帧&#xff…

信号完整性分析基础知识之传输线和反射(五):较短阻抗不连续的传输线、残桩和末端容性负载引起的反射

首先来一首定场诗&#xff1a;难难难&#xff0c;道德玄&#xff0c;不对知音不可谈。对了知音谈几句&#xff0c;不对知音枉费舌尖。 较短不连续点引起的反射 很多时候&#xff0c;板载走线的宽度必须要收窄&#xff0c;特别是经过PF区域或者拥挤区域。如果传输线的某一小段…

eSIM证书要求-证书验证-EID

SM-DP 和 SM-DS 应该验证 EUM 和 eUICC 证书中限制的 IIN 和 EID 的一致性&#xff08;参见第 4.5.2.1.0.2 和 4.5.2.1.0.3 节&#xff09;&#xff0c;并考虑 SGP.29 [ 89]。 根据 SGP.29 [89] 颁发的 EID 没有 SGP.02 [2] 中定义的 8 位 IIN。 相反&#xff0c;它们具有可变长…

【计算机视觉 | Python】十个 Python 图像处理工具,建议点赞收藏

文章目录 一、前言二、常见的库2.1 scikit-image2.2 NumPy2.3 SciPy2.4 PIL / Pillow2.5 OpenCV-Python2.6 SimpleCV2.7 Mahotas2.8 SimpleITK2.9 pgmagick2.10 Pycairo 一、前言 这些 Python 库提供了一种简单直观的方法来转换图像并理解底层数据。 今天的世界充满了数据&am…

linux【网络编程】之UDP网络程序模拟实现

linux【网络编程】之UDP网络程序模拟实现 一、开发环境二、服务端实现2.1 接口认识2.1.1 socket创建网络通信套接字2.1.2 bind&#xff1a;绑定Ip和端口号2.1.3 sockaddr_in结构体2.1.4 IP地址转换函数&#xff1a;inet_addr、inet_ntoa2.1.5 recvfrom&#xff1a;读取数据 2.2…

大语言模型进化树重磅发布,感慨技术方向选择的残酷,文末有彩蛋

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天说点有深度的内容。五一假期&#xff0c;学习了一篇论文《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》。 这篇论文来自 Amazon 以及 Texas A&M University 研究团队&…

【2023 · CANN训练营第一季】应用开发深入讲解——第五章 端到端案例讲解

学习资源 样例介绍 使用DVPP加速预处理网络输入&#xff0c;并通过模型转换使能静态AIPP功能&#xff0c;使能AIPP功能后&#xff0c;YUV420SP_U8格式图片转化为RGB&#xff0c;然后减均值和归一化操作&#xff0c;并将该信息固化到转换后的离线模型中&#xff0c;对ResNet50…

传统IDC服务器迁移上云流程

上云是趋势&#xff0c;越来越多企业的IDC服务器选择迁移上云&#xff0c;迁移上云的方式有很多&#xff0c;阿里云提供服务器迁移中心SMC来帮助用户迁移上云。使用SMC服务器迁移中心&#xff0c;将您的源服务器方便快捷地迁移至阿里云&#xff0c;支持的迁移源类型包括IDC服务…

【Java EE 初阶】锁策略以及CAS问题

目录 1.常见的锁策略 1.乐观锁 vs 悲观锁 2.读写锁 3.重量级锁 vs 轻量级锁 4.自旋锁&#xff08;Spin Lock&#xff09; 5.公平锁 vs 非公平锁 6.可重入锁 vs 不可重入锁 7.Synchronized实现了哪些锁策略&#xff1f; 1.是乐观锁也是悲观锁 2.既是轻量级锁也是重量级…

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明IIC时序对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCADS1115 ADC模块1.2、STM32F103C8T6ADS1115 ADC模块 五、基础知识学习…

解决“未在本地计算机注册“OraOLEDB.Oracle.1”提供程序“问题

由于本地使用Oracle.ManagedDataAccess批量插入问题&#xff0c;连接数据库时报错 : ProviderOraOLEDB.Oracle;Data Sourceorcl;User IdQueueDp;PasswordQueueDp 此问题之前解决过没记录&#xff0c;又遇到了&#xff0c;忘了怎么解决&#xff0c;试了很多没效果 解决办法一、…

用好git stash,工作超nice

一、介绍 如果修改后的内容还不想commit&#xff0c;就可以用git stash命令。它会将工作区和暂存区中的修改(也就是还没commit的内容)都会被保存到堆栈里&#xff0c;并在之后恢复到任意指定的分支上。 二、应用场景 1、在分支a进行开发feature 1时&#xff0c;突然需要紧急…