设计模式:单例

一.什么是单例模式

        单例模式是一种设计模式,指在整个程序生命周期中有且仅有一个实例的类。可以分为懒汉式以及饿汉式。

        懒汉式:只有在类的实例被使用时才生成唯一实例。但是存在线程安全以及内存泄露的问题。可以节省系统资源。

        饿汉式:程序一旦开始运行就产生实例,自身没有线程安全问题。

二.特点

        1.将构造函数设置为private,可以禁止栈上构造,避免生成多个实例。

        2.将拷贝构造与拷贝赋值设置为delete。

        3.使用static成员函数定义接口函数与实例指针保证唯一,使用互斥锁保证线程安全,使用智能指针避免内存泄漏。

三.实现

1.互斥锁+智能指针(懒汉式)

#include <iostream>
#include <mutex>
#include <memory>

class Single_instance{
    using ptr = std::shared_ptr<Single_instance>;
public:
    Single_instance(const Single_instance&) = delete;
    Single_instance& operator=(const Single_instance&) = delete;
    ~Single_instance(){ std::cout << "Deconstruction call.\n"; }

    static ptr get_instance(){
        if(_instance == nullptr){
            std::unique_lock<std::mutex> lock(_mux);
            if(_instance == nullptr){
                _instance = std::shared_ptr<Single_instance>(new Single_instance);
            }
        }
        return _instance;
    }
private:
    Single_instance(){ std::cout << "Construction call.\n"; }

    static ptr _instance;
    static std::mutex _mux;
};

std::shared_ptr<Single_instance> Single_instance::_instance = nullptr;
std::mutex Single_instance::_mux;

int main(){
    auto instance = Single_instance::get_instance();
    auto instance1 = Single_instance::get_instance();

    return 0;
}

运行构造函数调用一次,析构函数正常调用。

2.使用类静态变量返回实例引用(懒汉式推荐)

        原理:当存在多线程申请实例时,局部静态变量只初始化一次是线程安全的。

#include <iostream>

class Single_instance {

public:
    Single_instance(const Single_instance &) = delete;

    Single_instance &operator=(const Single_instance &) = delete;

    ~Single_instance() { std::cout << "Deconstruction call.\n"; }

    static Single_instance &get_instance() {
        static Single_instance _instance;
        return _instance;
    }

private:
    Single_instance() { std::cout << "Construction call.\n"; }
};


int main() {
    Single_instance& instance = Single_instance::get_instance();
    Single_instance& instance1 = Single_instance::get_instance();

    return 0;
}

3.饿汉式单例

#include <iostream>

class Single_instance {

public:
    Single_instance(const Single_instance &) = delete;

    Single_instance &operator=(const Single_instance &) = delete;

    static Single_instance *get_instance() {
        return _instance;
    }

    static void delete_instance() {
        if (_instance) {
            delete _instance;
            _instance = nullptr;
        }
    }

private:
    Single_instance() { std::cout << "Construction call.\n"; }

    ~Single_instance() { std::cout << "Deconstruction call.\n"; }

    static Single_instance *_instance;
};

Single_instance *Single_instance::_instance = new Single_instance;

int main() {
    auto instance = Single_instance::get_instance();
    auto instance1 = Single_instance::get_instance();

    Single_instance::delete_instance();

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10万+收藏!10万转发!AI绘画如何助力育儿赛道引爆短视频平台?

在自媒体领域&#xff0c;内容创作的竞争日益激烈&#xff0c;但育儿自媒体一直是一块热门且持久的“金矿”&#xff0c;吸引了无数创作者投身其中。然而&#xff0c;如何在这片红海中脱颖而出&#xff0c;成为了许多创作者面临的难题。而AI绘画的出现&#xff0c;无疑解决了创…

这种好看的航线图怎么绘制?超简单~~

今天这篇推文小编给大家介绍一个我一直想绘制的可视化作品-航线地图&#xff0c;网上有很多类似的教程&#xff0c;但在小编看来&#xff0c;都或多或少有些不完美&#xff0c;小编这次就对其进行完善和美化&#xff0c;主要内容如下&#xff1a; 航线地图所需数据处理 航线地…

Linux实践|设置静态 IP 地址

引言 如果您是 Linux 系统管理员&#xff0c;那么您将需要在系统上配置网络。与可以使用动态 IP 地址的台式机不同&#xff0c;在服务器基础设施上&#xff0c;您需要设置静态 IP 地址&#xff08;至少在大多数情况下&#xff09;。 本文[1]旨在向您展示如何在最常用的 Linux 发…

The 2024 ICPC Kunming Invitational Contest K. Permutation(交互 期望)

在知乎内查看 题目 思路来源 题解 首先特判n1的情况&#xff0c;其实也不用问 分治&#xff0c;假设当前解决到[l,r]&#xff0c;要递归的vector是x&#xff0c; 维护两个vector L、R&#xff0c;代表下一步要在[l,mid]和[mid1,r]分治的vector 每次将x random_shuffle后&a…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布&#xff0c;是一种猜拳游戏。起源于中国&#xff0c;然后传到日本、朝鲜等地&#xff0c;随着亚欧贸易的不断发展它传到了欧洲&#xff0c;到了近现代逐渐风靡世界。简单明了的规则&#xff0c;使得石头剪子布没有任何规则漏洞可钻&#xff0c;单次玩法比…

Qt实现Halcon窗口显示当前图片坐标

一、前言 Halcon加载图片的窗口&#xff0c;不仅能放大和缩小图片&#xff0c;还可以按住Ctrl键显示鼠标下的灰度值&#xff0c;这种方式很方便我们分析缺陷的灰度和对比度。 二、实现方式 ① 创建显示坐标和灰度的widget窗口 下图的是widget部件&#xff0c;使用了4个label控…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

【Linux】认识Linux内核中进程级别的文件结构体【files_struct】&文件IO模型初步演示

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式

输电线路悬垂线夹检测无人机航拍图像数据集&#xff0c;总共1600左右图片&#xff0c;悬垂线夹识别&#xff0c;标注为voc格式 输电线路悬垂线夹检测无人机航拍图像数据集介绍 数据集名称 输电线路悬垂线夹检测数据集 (Transmission Line Fittings Detection Dataset) 数据集…

centos7.9升级rockylinux8.8

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件&#xff0c;数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…

75.【C语言】文件操作(3)

目录 6.文件的顺序读写 1.几个顺序读写函数 1.fgetc函数 代码示例 代码改进 2.fputc函数 3.fputs函数 如果需要换行,应该写入换行符(\n) 4.fgets函数 1.读取单行字符串 2.读取多行字符串 6.文件的顺序读写 1.几个顺序读写函数 分组:(fgetc,fputc),(fgets,fputs),(f…

【数据结构-栈】【位运算优化】力扣3170. 删除星号以后字典序最小的字符串

给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ‘’ 字符&#xff0c;同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典…

ENSP静态路由实验 10.11

0x01 拓扑图 0x02 配置各接口和PC1、2的IP地址 PC1&#xff1a; PC2&#xff1a; AR1&#xff1a; 配置AR1&#xff0c;改名为R1&#xff0c;并配置各接口IP&#xff0c;随后保存。 <R1>system-view [Huawei]sysname R1 [R1]int g0/0/2 [R1-GigabitEthernet0/0/2]ip ad…

Golang | Leetcode Golang题解之第456题132模式

题目&#xff1a; 题解&#xff1a; func find132pattern(nums []int) bool {candidateI, candidateJ : []int{-nums[0]}, []int{-nums[0]}for _, v : range nums[1:] {idxI : sort.SearchInts(candidateI, 1-v)idxJ : sort.SearchInts(candidateJ, -v)if idxI < idxJ {ret…

短剧小程序短剧APP在线追剧APP网剧推广分销微短剧小剧场小程序集师知识付费集师短剧小程序集师小剧场小程序集师在线追剧小程序源码

一、产品简介功能介绍 集师专属搭建您的独有短剧/追剧/小剧场小程序或APP平台 二、短剧软件私域运营解决方案 针对短剧类小程序的运营&#xff0c;以下提出10条具体的方案&#xff1a; 明确定位与目标用户&#xff1a; 对短剧类小程序进行明确定位&#xff0c;了解目标用户群体…

go发送邮件:在Go语言中实现发邮件的教程?

go发送邮件的教程指南&#xff1f;怎么使用Go语言发送电子邮件&#xff1f; Go语言&#xff0c;作为一种简洁、高效且并发性强的编程语言&#xff0c;自然也提供了丰富的库来支持邮件发送功能。AokSend将详细介绍如何在Go语言中实现发送邮件的功能&#xff0c;帮助你快速掌握这…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

垂直分库分表、水平分库分表

垂直分库&#xff1a;分出来的数据库的结构完全不一样&#xff0c;垂直分库&#xff0c;更像单体项目到问服务项目过度&#xff0c;根据业务拆分多个模块&#xff0c;每个模块把数据单独抽离出来作为数据库&#xff0c;垂直分库就是根据不同的表业务放在不同放数据库里&#xf…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …