单例模式类设计|什么是饿汉模式和懒汉模式

news2025/1/22 13:11:49

前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

高质量干货博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482


什么是单例模式

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全 局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件 中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置 信息,这种方式简化了在复杂环境下的配置管理。

单例模式有两种实现方式:

  • 饿汉模式
  • 懒汉模式

饿汉模式

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象

优点:

  • 简单、没有线程安全问题

缺点:

  • 当一个程序中有多个单例,并且有先后初始化顺序的要求的时候,饿汉无法控制。
  • 饿汉单例类创建得多的时候,初始化任务多的时候,会影响程序的启动速度。
//设计只能创建一个对象的类(单例模式)
//有两种设计方案
//饿汉模式 -- 一开始(main())之前就创建出对象了
#if 1
class MemoryPool //假设要求设计一个内存池 -- 要求是单例的 ,当然只是名字而已,我们不是真的实现内存池
{
public:
	static MemoryPool* GetInstance()
	{
		return _pinst;
	}
	void* Alloc(size_t n)
	{
		void* ptr = nullptr;
		//...
		//里面啥东西我们不管
		return ptr;
	}
	void Dealloc(void* ptr)
	{
		//...
	}
protected:
	char* _ptr = nullptr;
protected:
	//构造函数私有
	MemoryPool() {}
	//两种写法,这里只写了一种,写成指针也可以,不写成指针也可以
	static MemoryPool* _pinst;//声明
};
MemoryPool* MemoryPool::_pinst = new MemoryPool;


#define MemoryPoolObject MemoryPool::GetInstance()
int main()
{
	//一般是这样调用的,直接调就行
	void* ptr1 = MemoryPool::GetInstance()->Alloc(10);
	MemoryPool::GetInstance()->Dealloc(ptr1);
	//单例模式一般就是通过这个 MemoryPool::GetInstance() 去找到这个已经创建好的对象,去调它里面的东西
	void* ptr2 = MemoryPoolObject->Alloc(29);
	MemoryPoolObject->Dealloc(ptr2);
	return 0;
}
#endif

懒汉模式

对象第一次使用的时候再创建。

优点:

  • 可以控制顺序
  • 不影响启动速度

缺点:

  • 相对复杂
  • 线程安全问题要处理好
//懒汉模式
//对象第一次使用的时候再创建
class MemoryPool //假设要求设计一个内存池 -- 要求是单例的 ,当然只是名字而已,我们不是真的实现内存池
{
public:
	static MemoryPool* GetInstance()
	{
		//如果发现指针是nullptr的时候,说明我们是第一次使用这个类
		if (_pinst == nullptr)
		{
			//第一次创建
			cout << "第一次创建对象" << endl;
			_pinst = new MemoryPool;
		}
		return _pinst;
	}
	void* Alloc(size_t n)
	{
		void* ptr = nullptr;
		//...
		//里面啥东西我们不管
		return ptr;
	}
	void Dealloc(void* ptr)
	{
		//...
	}
	class CGarbo
	{
	public:
		~CGarbo()
		{
			if (_pinst)delete _pinst;
		}
	};
protected:
	char* _ptr = nullptr;
protected:
	//构造函数私有
	MemoryPool() {}
	//两种写法,这里只写了一种,写成指针也可以,不写成指针也可以
	static MemoryPool* _pinst;//声明
};
MemoryPool* MemoryPool::_pinst = nullptr;
//回收对象
//在main结束之后,它会调用析构函数,就会释放单例对象
static MemoryPool::CGarbo gc;
#define MemoryPoolObject MemoryPool::GetInstance()
int main()
{
	//一般是这样调用的,直接调就行
	cout << " -------- 第一次使用 -------- " << endl;
	void* ptr1 = MemoryPool::GetInstance()->Alloc(10);
	MemoryPool::GetInstance()->Dealloc(ptr1);
	//单例模式一般就是通过这个 MemoryPool::GetInstance() 去找到这个已经创建好的对象,去调它里面的东西
	cout << " -------- 第二次使用 -------- " << endl;
	void* ptr2 = MemoryPoolObject->Alloc(29);
	MemoryPoolObject->Dealloc(ptr2);
	return 0;
}

单例模式的释放问题

  • 一般情况下,单例对象不需要释放 -- 一般来说整个程序运行期间都会用它。单例对象再进程正常结束之后,也会资源释放。
  • 有些特殊场景需要释放,比如单例对象析构时候,需要进行一些持久化操作(往文件、数据库里面去写),大思路:定义一个内部的垃圾回收类

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

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

相关文章

汇编实现1-100累加(ARMv7)

汇编实现1-100累加 代码.text .globl _start _start:mov r0,#0 summationmov r1,#0 autoIncrementbl funadd funadd:cmp r1,#100addccs r0,r1,r0addccs r1,r1,#1mov pc,lr stop:b stop .end运行效果

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型 给本帖投票 56211打赏收藏 分享 转发到动态举报 写回复 性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增>> 11 条回复 切换为时间正序 请发表友善的回复… 发表回复 microsof…

UWB天线设计之一种优化扁平超宽带单极的新方法

文章亮点 一种新颖的方法提出了扁平超宽带单极天线。 通过应用收缩,可以设计具有相同性能的更小的天线作为平面单极天线。 优化结果表明该方法能够设计非常小的天线。 在这项研究中,提出了一种优化扁平超宽带单极天线的新方法。在该方法中,一般性地描述了天线的形状。这种一…

Http 接口测试框架

目录 前言&#xff1a; 实际效果 框架的下一步 最新框架图&#xff08;红色部分未完成&#xff09; 部分代码 你需要做的 前言&#xff1a; 在进行HTTP接口测试时&#xff0c;使用一个可靠的测试框架可以提高测试效率和质量。HTTP接口测试框架是一种用于自动化测试HTTP接…

STM32数字小键盘

基于STM32的数字小键盘 自己的键盘小键盘数字键坏了几个&#xff0c;准备自己用STM32做一个数字键盘。 硬件 找了一些资料&#xff0c;感谢知乎老哥。 原理图 采用的是主控是STM32F103RBT6&#xff0c;上拉1.5K接高速USB。按键采用的是矩阵按键。轴位可以自己选择。还接了一…

OpenCv之图像轮廓

目录 一、图像轮廓定义 二、绘制轮廓 三、计算轮廓面积与周长 一、图像轮廓定义 图像轮廓是具有相同颜色或灰度的连续带你的曲线.轮廓在形状分析和物体的检测和识别中很有用 轮廓的作用: 用于图形分析物体的识别与检测 注意点: 为了检测的准确性&#xff0c;需要先对图像…

AI 救不了好莱坞,16 万演员联合编剧上演史诗级「罢工大戏」

内容一览&#xff1a; 近日&#xff0c;美国演员工会正式加入编剧工会行列&#xff0c;开始举行罢工&#xff0c;由此&#xff0c;被多家媒体称为好莱坞「末日」时刻来临。值得关注的是&#xff0c;本次罢工的原因&#xff0c;除了老生常谈的薪资问题&#xff0c;还有一个重要的…

多用户商城系统Dokan评测优点与缺点(2023)

目录 多用户商城系统Dokan优点 多用户商城系统Dokan缺点 您应该开始使用多供应商市场吗&#xff1f; 多用户商城系统Dokan评论 为什么选择Dokan&#xff1f; 用户界面 用户友好的前端 仪表板和后端 管理员后台 供应商仪表板 第三方兼容性 Dokan 可以卖什么&…

c#调用cpp库,debug时不进入cpp函数

选中c#的项目&#xff0c;右击属性&#xff0c;进入属性页&#xff0c;点击调试&#xff0c;点击打开调试启动配置文件UI&#xff0c;打开启用本机代码调试。

Scrapy和Selenium整合(一文搞定)

文章目录 前言一、开始准备1. 包管理和安装chrome驱动2. 爬虫项目的创建&#xff08;举个栗子&#xff09;3. setting.py的配置 二、代码演示1. 主爬虫程序2. 中间件的配置3. 定义item对象4. 定义管道 总结 前言 scrapy和selenium的整合使用 先定个小目标实现万物皆可爬&#…

Loadrunner结合Fiddler实现脚本的录制

Loadrunner一直被业内认为是最好用的性能测试工具&#xff0c;行业大哥大, 但是用过Loadrunner的朋友都知道&#xff0c;工具功能的确牛&#xff0c;但实际使用过程中总会有一些困扰新手的问题&#xff0c;无法录制脚本&#xff0c; 如遇到Loadrunner不支持的IE版本、对Chrome、…

【C语言】Sleep()函数----详解

&#x1f341; 博客主页:江池俊的博客 &#x1f341;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f341; 如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏&#x1f31f; 三连支持一下博主&#x1f49e; 目录 前言 &#x1f4cc;C语言sleep函…

一本通1919:【02NOIP普及组】选数

这道题感觉很好玩。 正文&#xff1a; 先放题目&#xff1a; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1919 描述 已知 n 个整数 x1,x2,…,xn&#xff0c;以及一个整数 k&#xff08;k&#…

Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Vuex基本使用

目录 一、什么是vuex二、什么时候使用 Vuex三、Vuex 工作原理图四、vuex 核心概念和 API4.1 state4.2 actions4.3 mutations4.4 getters 五、代码生成器5.1 mapGetters5.2 mapState5.3 mapActions5.4 mapMutations 六、vuex模块化编码七、求和案例 一、什么是vuex 专门在 Vue …

文本生成人工评价指标及一致性校验方法总结(附代码实现)

前言&#xff1a;人工评估&#xff08; Manual Evaluation / Human Evaluation&#xff09;是文本生成工作评估中非常重要的一环。在对模型的文本生成质量进行评估时&#xff0c;除客观的自动评价指标&#xff0c;还需有人工评价指标的主观判断&#xff0c;综合二者的结果完成评…

zabbix监控自己

目录 一、实验环境准备 二、server端 1、配置阿里云yum源 2、部署lamp环境 3、启动lamp对应服务 4、准备java环境 5、源码安装zabbix 6、mariadb数据库授权 7、创建zabbix程序用户并授权防止权限报错 8、修改zabbix配置文件 9、配置php与apache 10、web安装zabbix …

[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)

在编程方面&#xff0c;从来都是实践出真知&#xff0c;书读百遍其义自见&#xff0c;所以实战是最好的提升自己编程能力的方式。 前一段时间&#xff0c;写了一些实战系列文章&#xff0c;如&#xff1a; ASP.NET MVC开发学生信息管理系统VueAntdvAsp.net WebApi开发学生信息…

地摊盛行,VR全景如何帮助实体餐饮商家人气翻倍?

“民以食为天”&#xff0c;餐饮行业始终在市场经济中扮演着重要角色&#xff0c;前有“淄博烧烤火爆出圈”&#xff0c;后有“地摊经济夜市亮相”&#xff0c;可以看到餐饮行业呈现出市场广阔、高频刚需、标准化程度低的特点。但是地摊经济的盛行&#xff0c;让很多实体餐饮商…

【漏洞修复】node-exporter被检测/debug/vars泄漏信息漏洞

node-exporter被检测/debug/vars泄漏信息漏洞 漏洞说明修复方法 漏洞说明 和之前的pprof类似&#xff0c;都是国产的安全工具扫出来的莫名其妙的东西&#xff0c;这次也是报的node-exporter存在这个漏洞&#xff0c;又归我处理。当访问node-exporter的/debug/vars路由时能获取…