设计模式—— 单例设计模式

单例设计模式

什么是单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

为什么使用单例模式

在应用系统开发中,我们常常有以下需求:

1.需要生成唯一序列的环境

2.需要频繁实例化然后销毁的对象。

3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

4.方便资源相互通信的环境

实际案例:

  • 多线程中网络资源初始化
  • 回收站机制
  • 任务管理器
  • 应用程序日志管理

单例模式实现步骤

  1. 构造函数私有化
  2. 提供一个全局的静态方法,访问唯一对象
  3. 类中定义一个静态指针,指向唯一对象
    在这里插入图片描述

单例模式实现代码

懒汉式

#include <iostream>
using namespace std;
//懒汉式
class SingleTon 
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//懒汉式并没有创建单例对象
SingleTon* SingleTon::m_singleTon = NULL;		
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<<  hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{if (m_singleTon == NULL) {m_singleTon = new SingleTon;}return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}

饿汉式

#include <iostream>
using namespace std;
//懒汉式
class SingleTon 
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//饿汉式创建单例对象
SingleTon* SingleTon::m_singleTon = new SingleTon;		
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<<  hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}

单例模式优缺点

优点

  • 在内存中只有一个对象,节省内存空间;
  • 避免频繁的创建销毁对象,可以提高性能;
  • 避免对共享资源的多重占用,简化访问;
  • 为整个系统提供一个全局访问点。

缺点

  • 不适用于变化频繁的对象;
  • 如果实例化的对象长时间用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

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

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

相关文章

聊聊PowerJob的UseCacheLock

序 本文主要研究一下PowerJob的UseCacheLock UseCacheLock tech/powerjob/server/core/lock/UseCacheLock.java Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface UseCacheLock {String type();String key();int concurrencyLevel(); }Use…

【MIdjourney】镜头效果关键词

1.景深(depth of field) 景深&#xff08;DOF&#xff09;&#xff0c;是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头距离、及焦平面到拍摄物的距离是影响景深的重要因素。 在MIdjourney中&#xff0c;该关键字会使得…

数字化时代,CDMP/CDGA认证企业个人都需要

&#x1f3af;数字化时代&#xff0c;CDMP(数据管理专业人士)和CDGA(数据治理工程师)认证对于企业和个人来说都是非常重要的。 &#x1f4d2;对于企业而言&#xff1a; ✅为企业赋能 数字化培训是企业在数字化转型中的重要考核标准之一。国资委、工信部、银保监会等都有明确的要…

【STM32读取HX711的函数】

[两个普通IO读取HX711数据的函数-主芯片是STM32F407] 以下是.h文件中的内容&#xff1a; #ifndef __hx711_h #define __hx711_h #define HX711CH1_DIO_GROUP GPIOA #define HX711CH1_CLK_GROUP GPIOA #define HX711CH1_DIO_PIN GPIO_Pin_1 #define HX711CH1_CLK_PIN GPIO_Pin…

深入浅出 Golang 中的参数传递机制

目录 什么是值传递 (Pass by Value) 引用传递 (Pass by Reference) Golang 中的参数传递方式 基本类型的值传递 切片的“引用”传递 使用指针实现引用传递 结构体的值传递 结构体指针的传递 小结 值传递&#xff08;Pass by Value&#xff09;和引用传递&#xff08;P…

Python之jieba分词相关介绍

1.jieba分词的安装 直接在cmd窗口当中pip install即可 2.jieba分词的介绍 jieba分词是目前比较好的中文分词组件之一&#xff0c;jieba分词支持三种模式的分词(精确模式、全模式、搜索引擎模式)&#xff0c;并且支持自定义词典(这一点在特定的领域很重要&#xff0c;有时候…

C++(20):list通过erase, erase_if删除元素

C++20前,使用成员函数erase删除元素,与vector的方法一致: iterator erase( iterator pos ); iterator erase( iterator first, iterator last ); 1.通过迭代器删除指定位置元素 需要说明的是,删除元素后,迭代器会失效,可以通过erase返回下一个有效的迭代器 #include &…

SpringBoot使用MockMVC单元测试Controller

对模块进行集成测试时&#xff0c;希望能够通过输入URL对Controller进行测试&#xff0c;如果通过启动服务器&#xff0c;建立http client进行测试&#xff0c;这样会使得测试变得很麻烦&#xff0c;比如启动速度慢&#xff0c;测试验证不方便&#xff0c;依赖网络环境等&#…

GitHub项目推荐-incubator

项目地址 Github地址&#xff1a;GitHub - apache/incubator-anser 官网&#xff1a;Apache Answer | Free Open-source Q&A Platform 项目简述 这是Apache的一个开源在线论坛&#xff0c;也可以部署成为一个自有的QA知识库。项目主要使用了Go和Typescript来开发&#…

【MATLAB源码-第109期】基于matlab的哈里斯鹰优化算发(HHO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 哈里斯鹰优化算法&#xff08;Harris Hawk Optimization, HHO&#xff09;是一种受自然界捕食行为启发的优化算法。它基于哈里斯鹰的捕猎策略和行为模式&#xff0c;主要用于解决各种复杂的优化问题。这个算法的核心特征在于…

层叠布局(Stack)

目录 1、概述 2、开发布局 3、对齐方式 3.1、TopStart 3.2、Top 3.3、TopEnd 3.4、Start 3.5、Center 3.6、End 3.7、BottomStart 3.8、Bottom 3.9、BottomEnd 4、Z序控制 5、场景示例 1、概述 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一…

31 树的存储结构二

DIsplay() 递归显示 :图示 求树的高度时&#xff0c;递归的技巧 在递归的过程中&#xff1a;ret单独和任意一个子树的子高度比较&#xff0c;如果ret<max&#xff0c;retmax ------------- 注意&#xff1a;组织链表和子链表的【元素类型】都是TLNode* 链表都要先通过TLNod…

JavaScript 动态生成内容的过程

网页使用 JavaScript 动态生成内容的过程涉及到 JavaScript 脚本与网页的 HTML 和 CSS 的交互。基本过程如下&#xff1a; 浏览器加载 HTML&#xff1a;首先&#xff0c;浏览器加载网页的 HTML 内容&#xff0c;这构成了页面的基本结构。 执行 JavaScript&#xff1a;随后&…

Validation--自定义校验

前言&#xff1a; 今天学到这个&#xff0c;闲着也是闲着&#xff0c;就写一个记录一下&#xff0c;也算是总结 我们的步骤是这样的 1.自定义注解State 2.自定义校验数据的类StateValidation实现ConstrainValidator接口 3.在需要校验的地方使用自定义注解 1.自定义注解 这…

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准&#xff0c;直接影响到程序的修改和后期维护&#xff0c;那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 &#xff08;1&#xff09;C程序整体由函数构成的。 程序中&#xff0c;main()就是其中…

【C++学习笔记】C++多值返回写法

C不像python可以轻易地处理多值返回问题&#xff0c;处理使用指针或者引用将需要返回的值通过参数带出来&#xff0c;还有几种特殊的方式。 引用自&#xff1a;https://mp.weixin.qq.com/s/VEvUxpcJPsxT9kL7-zLTxg 1. Tuple tie 通过使用std::tie&#xff0c;我们可以将tuple…

Mysql事务隔离级别是怎么实现的?

Mysql事务 事务概念事务特性事务并发事务隔离级别MVCC多版本并发控制 事务概念 小钢同学今天发工资了&#xff0c;赶紧打开招商银行app看看工资到账了没有&#xff0c;查看余额300 嗯&#xff0c;今天心情好&#xff0c;给对象转账50大元买lv包包去&#xff0c;最后的结果肯定…

Vmware虚拟机问题解决方案 运行虚拟机系统蓝屏 运行虚拟机时报错VT-x

1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安装的VMware 弹出确认框, 点击…

四旋翼无人机入门基础知识

电池 聚合物锂电池单体电芯的额定电压都为3.7V 电池的保存电压&#xff1a;单个电芯3.8V 电池的满电电压&#xff1a;单个电芯4.2V 串联&#xff1a;容量不变&#xff0c;电压相加&#xff0c;并联&#xff1a;电压不变&#xff0c;容量相加 S&#xff1a;串联&#xff0c;P&…

基于博弈树的开源五子棋AI教程[7 多线程搜索]

文章目录 引子定义实现结果尾记 引子 多线程加快搜索速度这一认知是经受住实践考验的。博弈树搜索的并行搜索方式有很多种&#xff0c;例如叶子并行&#xff0c;根并行&#xff0c;树分裂等算法。笔者给出一种实现起来比较简单的根并行算法。 在是实现时需要注意两点&#xff…