Linux(十三)设计模式——单例模式

news2024/9/24 3:25:50

 设计模式——针对典型场景所设计出来的特别的处理方案

单例模式:一个类只能实例化一个对象(所以叫单例)

        场景:

                1、资源角度:资源在内存中只占有一份

                2、数据角度:如果只有一个对象,那么该对象在什么时候访问它的资源都是一致的

目录

 实现方式

一、饿汉模式

二、懒汉模式


就比如任务管理器,我再怎么重复打开它,它也只有这一份任务管理器。

 实现方式

 一、饿汉模式

所谓饿汉模式,直接将对象实例化完毕,用的时候直接就使用了(空间换时间)

        好处:效率最大化,资源用的时候直接就用了(不涉及线程安全问题)

        缺点:初始化速度慢,占用内存多

实现:使用静态成员变量(保证它在初始化就能有一份内存)

           将构造函数私有化(类外无法实例化对象,对象只能有一份)

           提供public接口进行访问

#include <iostream>

class Singleton
{
private:
    int _data;

private:
    static Singleton eton;
    Singleton() // 将构造函数私有化,意味着在类外无法实例化对象
    {           // 保证一个类只能实例化一个对象(构造函数私有化,该类也无法被继承)
        // 逻辑处理begin
        _data = 100;
        // 逻辑处理end
    }

public:
    static Singleton *GetInstence() // 静态成员只能被静态成员函数调用
    {
        return &eton;
    }
    int Get_data()    // 提供一个获取data的方法
    {
        return _data;
    }
};

// 静态成员变量,类内声明、类外定义
Singleton Singleton::eton;

int main()
{
    Singleton *eton = Singleton::GetInstence();
    std::cout << eton->Get_data() << std::endl;

    return 0;
}

二、懒汉模式

所谓懒汉模式,就是等待用的时候才去进行构造,才去进行实例化

        优点:内存资源占用少,初始化效率高

        缺点:需要访问资源的时候需要去实例化对象加载(第一次访问时对象时比较慢)(涉及线程安全问题)

实现:

        1、构造函数私有化(保证只能实例化一个对象)

        2、定义静态类型的指针,在用的时候进行new

        3、new的时候注意线程安全问题(加锁保护)

        4、避免已经实例化之后后续资源重复加解锁访问(double check)

        5、使用volatile修饰,避免编译器过度优化

                volatile:当一个变量经常被cpu访问,那就把这个变量放入一个寄存器中,这样对于这样一个高频访问的变量,cpu就可以直接从寄存器中访问,避免了来回从内存中拿取数据。

#include <iostream>
#include <mutex>

class Singleton
{
private:
    int _data;

private:
    static Singleton *_eton; // 1、定义静态的指针与锁
    static std::mutex _mutex;
    Singleton() /// 2、构造函数私有化(只能被实例化一次)
    {
        // 逻辑处理begin
        _data = 100;
        // 逻辑处理end
    }

public:
    int get_data() { return _data; }
    static Singleton *GetInsetnce()
    {
        if (_eton == nullptr) // 5、double check避免了已经实例化了还需要加解锁问题
        {
            _mutex.lock(); /// 4、使用mutex进行安全控制
            if (_eton == nullptr)
                _eton = new Singleton; // 3、等到用的时候进行new 调用构造实例化
            _mutex.unlock();
        }
        return _eton;
    }
};
// 6、对其构造和声明使用volatile修饰 保证数据的可见性
// volatile Singleton *Singleton::_eton = nullptr;
Singleton *Singleton::_eton = nullptr;
std::mutex Singleton::_mutex;

int main()
{
    Singleton *eton = Singleton::GetInsetnce();
    std::cout << eton->get_data() << std::endl;
}

 

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

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

相关文章

2019蓝桥杯真题质数(填空题) C语言/C++

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5…… 请你计算第 2019 个质数是多少&#xff1f; 运行限制 最大运行时间&#xff1a;1s 最大运行内存: 128M…

Mac下安装Tomcat以及IDEA中的配置

安装brew 打开终端输入以下命令&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 搜索tomcat版本&#xff0c;输入以下命令&#xff1a; brew search tomcat 安装自己想要的版本&#xff0c;例…

JDK版本区别

1. 泛型 ArrayList listnew ArrayList()------>ArrayList<Integer>listnew ArrayList<Integer>(); 2 自动装箱/拆箱 nt ilist.get(0).parseInt();-------->int ilist.get(0);原始类型与对应的包装类不用显式转换 3 for-each i0;i<a.length;i------------&…

解析从Linux零拷贝深入了解Linux-I/O(上)

本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。前言 存储器是计算机的核心部件之一&#xff0c;在完全理想的状态下&#xff0c;存储器应该要同时具备以下三种特性&#xff1a; 速度足够快&#xff1a;存储器的存取速度应当快于 CPU …

JWT安全漏洞以及常见攻击方式

前言 随着web应用的日渐复杂化&#xff0c;某些场景下&#xff0c;仅使用Cookie、Session等常见的身份鉴别方式无法满足业务的需要&#xff0c;JWT也就应运而生&#xff0c;JWT可以有效的解决分布式场景下的身份鉴别问题&#xff0c;并且会规避掉一些安全问题&#xff0c;如CO…

python+vue微信小程序的线上服装店系统

服装行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,服装行业也在发生着变化,单就服饰这一方面,利用手机购物正在逐步进入人们的生活。传统的购物方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。手机线上服装…

JavaEE|套接字编程之UDP数据报

文章目录一、DatagramSocket API构造方法常用方法二、DatagramPacket API构造方法常用方法E1:回显服务器的实现E2:带有业务逻辑的请求发送一、DatagramSocket API 在操作系统中&#xff0c;把socket对象当成了一个文件处理。等价于是文件描述符表上的一项。 普通的文件&#xf…

vbs简单语法及简单案例

文章目录一、简单语法1、变量2、输入3、输出4、选择语句5、循环二、用记事本编译中文乱码问题三、制作一个简单vbs脚本表白一、简单语法 1、变量 语法&#xff1a; dim 变量名例&#xff1a; dim a,b a1 b2 msgbox ab运行&#xff1a; 2、输入 语法&#xff1a;InputBox(…

【ip neigh】管理IP邻居( 添加ARP\NDP静态记录、删除记录、查看记录)

一、邻居管理存在状态 1、NUD_NONE&#xff1a; 初始状态。当一个新的路由缓存条目被创建时&#xff0c;arp_bind_neighbour()函数被调用.如果找不到相匹配的ARP缓存条目, neigh_alloc()将创建一个新的ARP缓存条目并设置状态为NUD_NONE. 2、NUD_INCOMPLETE&#xff1a;未完成状…

设计模式之适配器模式与桥接模式详解和应用

目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…

指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别&#xff1f; 前者是一个指针数组&#xff0c;数组大小为4&#xff0c;每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运行会报如下错误 main函数中定义的a数组本质是一个指向int[2]的…

内网渗透(三十八)之横向移动篇-pass the key 密钥传递攻击(PTK)横向攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

从0到1一步一步玩转openEuler--18 openEuler 管理服务-简介

文章目录18 管理服务简介18.1 概念介绍18 管理服务简介 systemd是在Linux下&#xff0c;与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务&#xff0c;提供基于守护进程的按需启动策略&#xff0c;支持快照和系统状态恢复&#xff0c;维护挂…

java基础学习 day41(继承中成员变量和成员方法的访问特点,方法的重写)

继承中&#xff0c;成员变量的访问特点 a. name前什么都不加&#xff0c;name变量的访问采用就近原则&#xff0c;先在局部变量中查找&#xff0c;若没找到&#xff0c;继续在本类的成员变量中查找&#xff0c;若没找到&#xff0c;继续在直接父类的成员变量中查找&#xff0c…

Mel Frequency Cepstral Coefficients (MFCCs)

wiki里说 在声音处理中&#xff0c;梅尔频率倒谱( MFC ) 是声音的短期功率谱的表示&#xff0c;基于非线性梅尔频率标度上的对数功率谱的线性余弦变换。 倒谱和MFC 之间的区别在于&#xff0c;在 MFC 中&#xff0c;频带在梅尔尺度上等距分布&#xff0c;这比正常频谱中使用的线…

Windows10 安装ElasticStack8.6.1

一、安装ElasticSearch8.6.1 1.官网下载ElasticSearch8.6.1压缩包后解压 2.安装为服务 elasticsearch-service.bat install 3.运行 elasticsearch-service.bat start 4.通过浏览器访问 http://localhost:9200/ 提示需要登录&#xff0c;但不知密码是啥。 5.重置密码 ela…

操作系统(day12)-- 基本分段存储,段页式存储

基本分段存储管理方式 不会产生内部碎片&#xff0c;会产生外部碎片 分段 按照程序自身的逻辑关系划分为 若干个段&#xff0c;每个段都有一个段名&#xff0c;每段从0开始编址 分段存储管理方式中一个段表项由段号&#xff08;隐含&#xff09;、段长、基地址 分段的段表项固…

Python基础2

1. python函数定义 函数定义语法&#xff1a; def 函数名&#xff08;传入参数&#xff09;&#xff1a; 函数体 return 返回值 —————————————— 参数如果不需要&#xff0c;可以省略返回值如果不需要&#xff0c;可以省略函数必须先定义在使用 注意&#xff…

UIE微调:autoML平台实践(一)

参考&#xff1a;uie模型微调个人总结 github&#xff1a;https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie 1、显存问题 之前是在实验室的服务器上跑&#xff08;2080ti&#xff0c;12G显存&#xff09;&#xff0c;频频出现以下报错&#xff1a; 原…

python 刷题时常见的函数

collections.OrderedDict 1. move_to_end() move_to_end() 函数可以将指定的键值对移动到最前面或者最后面&#xff0c;即最左边或最右边 。 2. popitem() popitem()可以完成元素的删除操作&#xff0c;有一个可选参数last&#xff08;默认为True&#xff09;&#xff0c;…