设计模式-单例模式

目的:为了保证一个类在程序中只有一个实例,并且能被全局访问

场景:全局线程池

要点:

通过 Test::Instance()获取类指针

class Test
{
public:
    static Test* Instance()
    {
        if (m_instance == nullptr)
        {
            std::lock_guard lock(m_mutex);
            if (m_instance == nullptr)
                m_instance = new Test;
        }
        return m_instance;
    }

    static void DeleteInstance()
    {
        if (m_instance)
        {
            std::lock_guard lock(m_mutex);
            if (m_instance)
            {
                delete m_instance;
                m_instance = nullptr;
            }
        }
    }

private:
    Test() {}

private:
    static Test *m_instance;
    static std::mutex m_mutex;
};

Test* Test::m_instance = NULL;
std::mutex Test::m_mutex;

每个类想要实现单例模式,都要写一遍 Instance的接口,有点麻烦,于是希望能用宏实现单例模式,最终使用效果为:

class Test
{
    SINGELTON(Test)
private:
    Test() {}
};

可以用类模板的方式来进行:

template
class Singleton
{

public:
    static T *Instance()
    {
        if (m_instance == nullptr)
        {
            std::lock_guard lock(m_instanceMutex);
            if (m_instance == nullptr)
                m_instance = std::unique_ptr(new T);
        }
        return m_instance.get();
    }

private:
    static std::unique_ptr m_instance;
    static std::mutex m_instanceMutex;
};

template std::mutex Singleton::m_instanceMutex;
template std::unique_ptr Singleton::m_instance(nullptr);

//单例宏
#define SINGELTON(OBJ_CLASS)                            \
    friend Singleton;                        \
                                                        \
public:                                                 \
    static OBJ_CLASS *Instance()                        \
    {                                                   \
        return Singleton::Instance();        \
    }

Original: https://www.cnblogs.com/yaronzz/p/16351984.html
Author: Yaronzz
Title: 设计模式-单例模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585295/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • vsftpd 操作手册-完整版

    vsftpd 目录 – ftp 简介 – vsftpd 简介 – vsftpd 安装&卸载 – vsftpd 配置文件 – vsftpd 认证模板 – vsftpd 配置模…

    Linux 2023年6月13日
    087
  • 网络扫描(二)

    免责声明:本文所述工具只用于网络安全的学习与研究。严禁任何阅读本文的读者利用本文所述工具进行违法犯罪活动。如有任何法律纠纷本文作者概不负责。 上一篇博文讲到了fping工具和nma…

    Linux 2023年6月14日
    097
  • Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一、说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API…

    Linux 2023年6月13日
    086
  • 嵌入式软件开发中必备软件工具

    1、前言 作为一个软件开发人员,除了程序能力素养方面外,还应该熟练地使用各种常用的辅助工具,所谓”工欲善其事,必先利其器”;通过这些工具能提升自己的专业素养…

    Linux 2023年6月7日
    0112
  • 线段树扫描线(一) 矩形面积 以hdu 1542为例

    还是老规矩,传送门 hdu 1542 不做过多解释了,就是给出n个矩形,求出这些矩形所覆盖的面积和。由于n很小,因而这道题不是必须用线段树 先想想怎么办,先来一个例图(稍微有点复杂…

    Linux 2023年6月6日
    0114
  • Redis多线程原理详解

    从上图中可以看出只有以下3个地方用的是多线程,其他地方都是单线程: 1:接收请求参数 2:解析请求参数 3:请求响应,即将结果返回给client 很明显以上3点各个请求都是互相独立…

    Linux 2023年5月28日
    089
  • 【Linux】【专项突破】CentOS下软件安装

    rpm yum软件仓库 配置文件 缓存处理 清理缓存 重构缓存 查询包的依赖关系 rpm 普通下载安装 rpm -ivh 包名 更新 rpm -Uvh 包全名 查询 rpm -q …

    Linux 2023年6月14日
    0122
  • Apache Shiro 身份验证绕过漏洞 (CVE-2020-1957)

    一、漏洞描述 Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,它执行身份验证、授权、加密和会话管理。 在具有 Spring 动态控制器的 1.5.2 之前…

    Linux 2023年6月13日
    0135
  • Spring中的声明式事务管理

    方式一:基于xml配置文件方式 1.创建一个测试类 package com.dzj.service; import com.dzj.dao.UserDaoImpl; import …

    Linux 2023年6月14日
    094
  • 需求分析到软件设计复习

    什么是需求分析? 需求分析就是需求分析师对用户期望的软件行为进行表述。 谁来表述 -> 需求分析师 谁有期望-> 用户 期望什么?-> 期望的软件行为 怎样表述?…

    Linux 2023年6月8日
    0108
  • php-redis 总结

    php-redis代码库和文档地址:https://github.com/phpredis/phpredis/#readme string 字符串类型: list 列表类型(也是链…

    Linux 2023年5月28日
    0107
  • Ubuntu 18.04 LTS的网络经常变成问号导致网速很慢的解决办法

    问题描述: Ubuntu系统Gnome桌面顶部栏的网络图标经常变成了一个问号。期间不能打开网页,在终端里面ping公网有时能通但丢包严重,或者根本就不通,错误提示 Temporar…

    Linux 2023年5月27日
    0125
  • clang 分四步编译main.c

    这里用的clang/clang++ 分四步编译main.c/main.cpp文件 1.1 C++源文件 #include int main() { std::cout <&l…

    Linux 2023年6月13日
    076
  • 搭建部署Docker

    Docker安装准备: 首先看下服务器是否有旧版本,如果有需要卸载并且安装依赖 然后下载docker仓库repo源: 安装完成后查看docker仓库版本信息: yum安装docke…

    Linux 2023年6月8日
    0110
  • 【河北科技大学数据结构课设】校园导航问题

    文档到我的资源下载 点击这里进入我的资源下载 1. 简单介绍 2. 代码 #include #include #include using namespace std; /*测试使…

    Linux 2023年6月8日
    0121
  • c++仿照go语言的error,函数返回值封装

    c++仿照go语言,程序返回错误时,可以附加错误信息 #ifndef __ERRORMSG_H_ #define __ERRORMSG_H_ #include struct Err…

    Linux 2023年6月14日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球