【C/C++】

news2024/11/17 15:35:56

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 单例模式
  • 饿汉式单例模式
  • 懒汉式单例模式
  • 单例模式的优缺点
    • 优点
    • 缺点
  • 应用示例

单例模式

单例模式确保了一个类只有一个实例,并提供一个全局访问点来获取这个实例。

单例模式的特点:

  • 1.一个类只有一个实例
  • 2.提供一个全局访问点来获取这个实例
  • 3.单例对象必须由单例类进行创建(构造函数设为私有 private)

如何实现单例模式?

构造析构拷贝构造私有
提供静态公有的获取对象的方法

image.png

饿汉式单例模式

在类刚开始加载的时候就创建好对象,不会出现线程安全问题

#include <iostream>
using namespace std;

class Singleton
{
private:
	// 静态成员变量在类声明时就已经初始化  
	static Singleton* sin;
	// 私有构造函数,确保外部无法直接创建实例  
	Singleton(){}
	Singleton(const Singleton& single) = delete;  // 使用delete替代私有构造函数
    // 析构函数也设置为私有,但这在饿汉式单例中不是必需的,因为对象是在程序结束时自动销毁的	
    ~Singleton(){}

public:
	static Singleton* getSingle()
	{
		// 直接返回已经初始化的静态对象的地址  
		return sin;
	}
	void fun()
	{
		cout << "Singleton::fun()" << endl;
	}

};
// 在类外初始化静态成员变量  
Singleton* Singleton::sin = new Singleton();

int main()
{

	//获取单例对象
	Singleton* single1 = Singleton::getSingle();
	single1->fun();
	
	getchar();
	return 0;
}

在类被加载时就被初始化为一个指向新创建的Singleton对象的指针。

因此,无论何时调用Singleton::getSingle(),它都会返回同一个对象的地址。

在程序结束时,这个静态的Singleton对象会被自动销毁

懒汉式单例模式

类加载时没有生成单例,而是在第一次调用获取实例的方法时才去创建这个单例。 会出现线程安全问题,即当多个线程同时访问某个对象或数据时,可能导致数据的不一致或错误

#include <iostream>
using namespace std;

class Singleton
{
private:
	static Singleton* sin;
	Singleton(){}
	Singleton(const Singleton& single) = delete;  // 使用delete替代私有构造函数
	~Singleton(){}

public:
	static Singleton* getSingle()
	{
		if (sin == nullptr) // 如果单例对象还未被创建  
		{
			sin = new Singleton(); // 创建单例对象  
		}
		return sin;
	}
	void fun()
	{
		cout << "Singleton::fun()" << endl;
	}

};
Singleton* Singleton::sin = nullptr;

int main()
{

	//获取单例对象
	Singleton* single1 = Singleton::getSingle();
	single1->fun();
	
	getchar();
	return 0;
}

单例模式的优缺点

优点

  1. 控制资源访问:通过单例模式,可以确保对某个资源的全局访问点只有一个,这样可以防止其他对象对该资源的访问导致状态不一致或数据污染。
  2. 减少系统开销:如果一个类的实例创建非常消耗资源(如读取配置文件、打开数据库连接等),使用单例模式可以确保系统只创建一个实例,从而减少系统开销。
  3. 简化配置:在单例模式中,由于类的实例是预先创建好的,因此在系统启动时就可以加载和初始化,这样可以简化配置和初始化工作。
  4. 便于管理:由于单例模式提供了全局访问点,因此可以很方便地对实例进行管理和维护
  5. 避免对象之间的直接耦合:使用单例模式可以避免对象之间的直接耦合,而是通过单例类来协调它们之间的关系。

缺点

  • 在多线程下,懒汉式单例模式可能会引起线程安全问题
  • 由于单例模式的本质是将类的实例化控制权交由类本身来管理,因此难以扩展。如果需要为单例类添加新的功能,可能需要修改原有的代码,这可能会违反开闭原则
  • 单例模式可能会将多个功能放在同一个类中,这可能会违反单一职责原则

应用示例

在使用 mysql 对象操作某个数据库中中,通常只使用一个 mysql 对象,对数据库进行复用连接,而不是为每个请求都创建一个新的连接

GetInstance 方法是获取单例实例的公共静态方法,使用 std::call_once 来确保线程安全地初始化单例实例

#include <mysql.h>  
#include <string.h>  
#include <iostream>  
#include <list>  
#include <mutex>  
  
using namespace std;  
  
class CMySql  
{  
private:  
    CMySql() {}  // 私有构造函数,防止外部使用 new 关键字创建实例  
    CMySql(const CMySql&) = delete;  // 删除拷贝构造函数  
    CMySql& operator=(const CMySql&) = delete;  // 删除赋值运算符  
  
public:  
    static CMySql& GetInstance() 
    {  
        std::call_once(initInstanceFlag, &InitSingleton);  
        return *m_pInstance;  
    }  
  
   
public:  
    ~CMySql(void);  
  
    bool ConnectMySql(const char* host, const char* user, const char* pass, const char* db, short nport = 3306);  
    void DisConnect();  
    bool SelectMySql(char* szSql, int nColumn, list<string>& lstStr);  
    bool GetTables(char* szSql, list<string>& lstStr);  
    bool UpdateMySql(char* szSql);  
  
private:  
    static CMySql* m_pInstance;  // 静态私有成员变量,保存类的唯一实例  
    static std::once_flag initInstanceFlag;  // 用于确保线程安全的初始化  
  
    MYSQL* m_sock;  
    MYSQL_RES* m_results;  
    MYSQL_ROW m_record;  
  
    // 初始化单例的函数  
    static void InitSingleton() 
{  
        m_pInstance = new CMySql();  
    }  
};  
  
// 初始化静态成员变量  
CMySql* CMySql::m_pInstance = nullptr;  
std::once_flag CMySql::initInstanceFlag;  
  
// 析构函数  
CMySql::~CMySql() 
{  
    // 清理资源等操作  
}  

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

## 01深度学习介绍与安装PyTorch

文章目录 深度学习的发展历史和基本概念早期历史兴起与发展基本概念 如何安装和设置PyTorch环境系统要求安装步骤验证安装 结语 深度学习的发展历史和基本概念 深度学习&#xff0c;一种通过使用具有多层结构的神经网络来学习数据的复杂模型的机器学习技术&#xff0c;近年来已…

Scikit是什么?

目录 一、Scikit是什么&#xff1f; 二、用Scikit做一个简单房价预测例子 三、sklearn知识点 一、Scikit是什么&#xff1f; Scikit就是scikit-learn&#xff0c;是一个免费软件机器学习库。 https://scikit-learn.org/stable/https://scikit-learn.org/stable/ 用于预测数…

ubuntu20配置深度学习环境

目录 系统环境安装anaconda文件的安装anaconda环境配置anaconda换中科大源常用的anaconda命令 安装显卡驱动安装CUDA下载cudnn安装pytorch更换conda源选择对应的pytorch版本进行安装 系统环境 ubuntu20&#xff0c;安装了ros noetic。 参考博客主要有&#xff1a; https://g…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类&#xff0c;是对 JDBC 的封装&#xff0c;简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架&#xff0c;例如&#xff1a;MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库&#xff1a; 准备…

C++相关概念和易错语法(11)(npos、string的基本使用)

本文主要是分享一些基础的用法和接口&#xff0c;不会涉及迭代器版本&#xff0c;也没有底层概念&#xff0c;主要是保证简单入门和使用。 1.npos string本质上是一个类&#xff0c;里面包含了上百个成员函数&#xff0c;在调用这个头文件后&#xff0c;我们要知道整个类都被…

OpenCV 为轮廓创建边界框和圆(62)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV检测凸包(61) 下一篇 :OpenCV如何为等值线创建边界旋转框和椭圆(62) ​ 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::boundingRect使用 OpenCV 函数 cv::mi…

foobar2000 for Mac:卓越音乐播放器

当您在寻找一款音质卓越、功能丰富的音频播放器时&#xff0c;foobar2000 for Mac无疑是您的首选。它拥有简洁明了的界面设计&#xff0c;易于上手&#xff0c;同时支持多种音频格式&#xff0c;让您无需担心兼容性问题。 foobar2000 for Mac v2.6.4免激活版下载 foobar2000 fo…

P6周人脸识别

一、前期准备 1.设置GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,PIL,pathlib,warningswarnings.filterwarnings("ignore") #忽…

SQL:NOT IN与NOT EXISTS不等价

在对SQL语句进行性能优化时&#xff0c;经常用到一个技巧是将IN改写成EXISTS&#xff0c;这是等价改写&#xff0c;并没有什么问题。问题在于&#xff0c;将NOT IN改写成NOT EXISTS时&#xff0c;结果未必一样。 目录 一、举例验证二、三值逻辑简述三、附录&#xff1a;用到的S…

SpringBoot自定义定时任务

通常&#xff0c;在我们的项目中需要定时给前台发送一些提示性消息或者我们想要的定时信息&#xff0c;这个时候就需要使用定时任务来实现这一功能&#xff0c;实现也很简单&#xff0c;接下来具体来看看吧~ 简单定时任务 首先&#xff0c;你需要在你的启动类上加上开启定时任…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5&#xff1a;自然语言处理实践&#xff08;情感分类&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;掌握RNN、LSTM、GRU的原理。 2&#xff1a;学习用RNN、LSTM、GRU网络建立训练模型&#xff0c;并对模型进行评估。 3&#xff1a;学习用RNN、LSTM、GRU网络做…

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

基于MQTT通信开发的失物招领小程序

项目架构设计 这个项目采用前后端分离的方式&#xff0c;重新设计了两条链路来支撑程序的信息获取和传递 前端的小程序页面再启动页面渲染时&#xff0c;直接通过DBAPI从后端数据库获取信息&#xff0c;直接渲染在小程序中项目中给DBAPI的定位是快速从后端获取信息&#xff0…

信息系统项目管理师0087:组织系统(6项目管理概论—6.2项目基本要素—6.2.6组织系统)

点击查看专栏目录 文章目录 6.2.6组织系统1.治理框架2.管理要素3.组织结构类型6.2.6组织系统 项目运行时会受到项目所在的组织结构和治理框架的影响与制约。为有效且高效地开展项目,项目经理需要了解组织内的组织机构及职责分配情况,帮助自己有效地利用其权力、影响力、能力、…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5; 程序员&#xff1a;职场关键角色通识宝…

【编程题-错题集】chika 和蜜柑(排序 / topK)

牛客对于题目链接&#xff1a;chika和蜜柑 (nowcoder.com) 一、分析题目 排序 &#xff1a;将每个橘⼦按照甜度由高到低排序&#xff0c;相同甜度的橘子按照酸度由低到高排序&#xff0c; 然后提取排序后的前 k 个橘子就好了。 二、代码 1、看题解之前AC的代码 #include <…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

Python-VBA函数之旅-oct函数

目录 一、oct函数的常见应用场景 二、oct函数使用注意事项 三、如何用好oct函数&#xff1f; 1、oct函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、oct函数的常见应用场景 oc…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

Linux理解文件操作 文件描述符fd 理解重定向 dup2 缓冲区 C语言实现自己的shell

文章目录 前言一、文件相关概念与操作1.1 open()1.2 close()1.3 write()1.4 read()1.4 写入的时候先清空文件内容再写入1.5 追加&#xff08;a && a&#xff09; 二、文件描述符2.1 文件描述符 fd 0 1 2 的理解2.2 FILE结构体&#xff1a;的源代码 三、深入理解文件描述…