C++面向对象设计模式——单例模式

ops/2025/2/2 2:00:12/

        关于单例模式,在接触面向对象的设计模式的小伙伴应该不陌生。今天我们来分别介绍一下单例模式中的饿汉模式和懒汉模式。

        先来看一下实现单例模式的原理:
        1、禁止在类外创建类对象,把构造函数、拷贝构造私有化
        2、确保类对象只有一份,在类中定一个静态成员指针变量或类对象
        3、提供一个获取静态类对象、指针的接口,设计静态成员函数用于获取静态类对象、指针

现在来看一下饿汉模式的单例:程序运行时就实例化出类对象,不管后期是否用到都会创建出来

//饿汉模式
#include <iostream>
using namespace std;class Single
{static Single obj;Single(void){}Single(Single &that){}
public:static Single &get_single(void){return obj;}
};
Single Single::obj;int main()
{Single &s1 = Single::get_single();Single &s2 = Single::get_single();//Single *s3 = new Single();      // 注意:不能通过new创建单例对象,否则会出现多个实例cout<<&s1<<" "<<&s2<<endl;return 0;
}

优点:不可能被多个线程同时运行时创建多份    (线程安全)
缺点:如果后期使用不到单例对象,浪费了资源

再来看懒汉模式的单例:  直到真正使用时才创建单例类对象

//懒汉模式
#include <iostream>
#include <pthread.h>
using namespace std;class Single
{static Single *obj;Single(void){cout<<"构造"<<endl;}Single(Single &that) {}
public:static Single &get_single(void){if(NULL==obj){obj=new Single;}return *obj;}
};
Single *Single::obj;void *run(void *arg)
{Single &s=Single::get_single();return NULL;
}int main()
{Single &s1=Single::get_single();Single &s2=Single::get_single();cout<<&s1<<" "<<&s2<<endl;for(int i=0;i<100;i++){pthread_t tid;pthread_create(&tid,NULL,run,NULL);}return 0;
}

优点:什么时候用什么时候创建,如果用不到就不会创建,节约了资源
缺点:可能多个线程同时创建,有可能会创建多份单例对象(线程不安全)(线程竞争问题)

上面是分别用饿汉模式和懒汉模式实现的单例,饿汉模式和懒汉模式各有其优缺点。

关于单例模式的应用场景

        1、任务管理器\日志管理器
        2、网站访问计数器
        3、线程池、内存池
        4、服务器的连接管理器

over


http://www.ppmy.cn/ops/131512.html

相关文章

java毕业设计之基于Bootstrap的常州地方旅游管理系统的设计与实现(springboot)

项目简介 基于Bootstrap的常州地方旅游管理系统的设计与实现有下功能&#xff1a; 基于Bootstrap的常州地方旅游管理系统的设计与实现的主要使用者分为用户功能模块和管理员功能模块两大部分&#xff0c;用户可查看景点信息、景点资讯等&#xff0c;注册登录后可进行景点订票…

RK3568 Android12跳过认证 预置谷歌服务GMS

在Rom开发中需要发布海外版本时基本都需要内置google服务,而规范方式集成的话都需要设备进行认证,获取google应用签名等非常复杂的一套流程,一般大厂才有这些资质和资源,这里介绍一种非常规方式集成GMS,跳过设置认证流程,在RK3568 android12环境亲测有效。 谷歌全家桶中…

数据分析师职业规划——数据分析师的职业焦虑与未来发展

身边的数据分析师经常有一种职业焦虑和怠倦感&#xff0c;尤其是三十岁左右的数据分析师。为什么会有这种感觉呢&#xff1f;怎样才能避免这种职业焦虑&#xff1f; 一、 数据分析师的打杂困惑 数据分析师的职业焦虑和怠倦来源于打杂困惑&#xff1a;做的事情都是打杂&#x…

react 18 react-router-dom V6 路由传参的几种方式

路由配置如下 label:"首页",meta:{title:"首页"}},{path: /,// <AutnToken><Layout></Layout></AutnToken>element:<Layout></Layout>,label:"首页",meta:{title:"首页"},children:[{path:/home,…

Mybatis学习笔记(三)

十、MyBatis的逆向工程 (一)逆向工程介绍 MyBatis的一个主要的特点就是需要程序员自己编写sql&#xff0c;那么如果表太多的话&#xff0c;难免会很麻烦&#xff0c;所以mybatis官方提供了一个逆向工程&#xff0c;可以针对单表自动生成mybatis执行所需要的代码&#xff08;包…

标签之文字排版,图片,链接,音视频(HTML) 基础版

目录 标签之文字排版,图片,链接,音视频知识点: 练习题一: 效果: 练习题二: 效果: 标签之文字排版,图片,链接,音视频知识点: 超文本:链接 标记:标签<> 双标签 单标签 <br>//换行 <hr>//水平线 向后tab 向前shifttab html注释<!----> css /**/ …

LLM | 论文精读 | CVPR | SelTDA:将大型视觉语言模型应用于数据匮乏的视觉问答任务

论文标题&#xff1a;How to Specialize Large Vision-Language Models to Data-Scarce VQA Tasks? Self-Train on Unlabeled Images! 作者&#xff1a;Zaid Khan, Vijay Kumar BG, Samuel Schulter, Xiang Yu, Yun Fu, Manmohan Chandraker 期刊&#xff1a;CVPR 2023 DOI…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …