设计模式1、单例模式 Singleton

news2025/1/8 20:52:33
解释说明:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例
要点如下
    有且仅有一个实例
    必须自行创建自己的唯一实例
    必须给所有其他对象提供这一实例
具体实现要点如下
    提供一个 private 构造函数(防止外部调用而构造类的实例)
    提供一个该类的 static private 对象
    提供一个 static public 函数,用于创建或获取其本身的静态私有对象(例如:GetInstance())
除此之外,还有一些关键点(需要多家注意,很容易忽视):
   线程安全(双检锁 - DCL,即:double-checked locking)
   资源释放
// 单例 - 懒汉式/饿汉式公用
class Singleton
{
public:
       static Singleton* GetInstance();
private:
       Singleton() {}  // 构造函数(被保护)
private:
       static Singleton* m_pSingleton;  // 指向单例对象的指针
       // GC 机制
       class GC
       {
       public:
              ~GC()
              {
                     // 可以在这里销毁所有的资源,例如:db 连接、文件句柄等
                     if (m_pSingleton != NULL) {
                           cout << "Here destroy the m_pSingleton..." << endl;
                           delete m_pSingleton;
                           m_pSingleton = NULL;
                     }
              }
              static GC gc;  // 用于释放单例
       };
};

// 单例 - 懒汉式(双检锁 DCL 机制)
Singleton* Singleton::m_pSingleton = NULL;
Singleton* Singleton::GetInstance()
{
       if (m_pSingleton == NULL)
              m_pSingleton = new Singleton();
       return m_pSingleton;
}

#include "singleton.h"
#include <iostream>
using namespace std;
Singleton::GC Singleton::GC::gc; // 重要
int main()
{
       Singleton::GetInstance();
       return 0;
}

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

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

相关文章

还在用 !=null 判空?让我们用Java8的全新API去优化代码吧

当我们编写Java代码时&#xff0c;经常需要处理空值&#xff08;null&#xff09;&#xff0c;因为空值可能导致NullPointerException异常&#xff0c;这是一个常见的运行时异常。在Java 8中&#xff0c;引入了Optional类来更优雅地处理可能为空的值&#xff0c;从而减少NullPo…

NOSQL Redis十大数据类型

String 字符串 string 是redis最基本的类型&#xff0c;而是使用最多的数据类型&#xff0c; 一个 key 对应一个 value string 类型是 二进制安全的&#xff0c;意思reidis 的string 可以包含任何数据&#xff08;任何数据都可以转换binary的&#xff09;&#xff0c;比如jpg图…

推荐一个好用的电商开源项目yudao源码

1、项目下载cloneruoyi-vue-pro: &#x1f525; 官方推荐 &#x1f525; RuoYi-Vue 全新 Pro 版本&#xff0c;优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 微信小程序&#xff0c;支持 RBAC 动态权限、数据权限、SaaS 多租户、…

使用日志分析工具了解网络情况

日志分析&#xff08;或日志文件分析&#xff09;是检查整个网络中生成的日志数据的过程&#xff0c;日志数据从各种来源生成&#xff0c;包括外围设备、工作站、服务器、应用程序以及其他硬件和软件组件&#xff0c;将它们收集到一个中心位置并进行分析&#xff0c;可以为了解…

提升工作效率的一些网站、应用、插件和小技巧(二)

前言 距离发布提升工作效率的一些网站、应用、插件和小技巧&#xff08;一&#xff09;已经过去了三年&#xff0c;这次再分享一下这三年里新 Get 到的一些工作、技巧&#xff0c;欢迎各位在评论区也分享一下自己使用的工具软件等&#xff0c;也希望下一个三年我还能继续坚持分…

蓝桥杯每日一题2023.9.28

AcWing 4409. 砍竹子 - AcWing 题目描述 题目分析 注&#xff1a;sqrtl的范围为long double&#xff0c;比sqrt更加精确 使用优先队列维护一段区间&#xff0c;如果连续一段相同就合并为一个区间&#xff0c;从大到小去枚举&#xff0c;每次先取出最大的一段&#xff0c;双…

MySQL到TiDB:Hive Metastore横向扩展之路

作者&#xff1a;vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程&#xff0c;由实际面临的问题出发&#xff0c;对当前主流的横向扩展方案进行了调研及对比测试&#xff0c;通过多方面对比数据择优选择TiDB方案。其次分享了整…

首批48所高校大模型开课“尝鲜”,AI教学赋能计划合作名单公布

为适应大模型时代快速迭代的人才需求&#xff0c;百度飞桨全新发布《AI教学赋能计划&#xff08;大模型特辑&#xff09;》&#xff0c;提供文心大模型、飞桨AI Studio星河社区、大模型课程资源、师资培训、高校竞赛等体系化支持&#xff0c;支持高校顺应时代潮流、共启大模型人…

LeetCode算法二叉树—116. 填充每个节点的下一个右侧节点指针

目录 116. 填充每个节点的下一个右侧节点指针 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;N…

爬虫抓取数据时显示超时,是爬虫IP质量问题?

当我们进行网络爬虫开发时&#xff0c;有时会遇到抓取数据时出现超时的情况。这可能是由于目标网站对频繁请求做了限制&#xff0c;或者是由于网络环境不稳定造成的。其中&#xff0c;爬虫IP的质量也是导致超时的一个重要因素。本文将探讨抓取数据时出现超时的原因&#xff0c;…

2023-9-28 JZ54 二叉搜索树的第k个结点

题目链接&#xff1a;二叉搜索树的第k个结点 import java.util.*;/** public class TreeNode {* int val 0;* TreeNode left null;* TreeNode right null;* public TreeNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方…

什么是大数据可视化

在互联网高速发展的当今&#xff0c;5G的兴起加速了数据传输的速度&#xff1b;与此同时&#xff0c;智能物联网如智慧家电、可穿戴设备等产品的火热&#xff0c;进一步扩充了数据获取的渠道。不仅仅在网页上、手机和电脑应用上以秒计产生海量数据&#xff0c;智能设备同时也在…

学习资源汇集

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 一、笔记软件 总结个人觉得好看并且简洁的软件&#xff0c;若是你觉得有更好的笔记软件&#xff0c;欢迎分享 Typora 最新版本收费…

【C/C++笔试练习】——常量指针和指针常量、位段的内存分配、统计输入的字母个数、排序子序列、倒置字符串

文章目录 C/C笔试练习1.常量指针和指针常量&#xff08;1&#xff09;常量指针和指针常量的定义&#xff08;2&#xff09;判别常量指针和指针常量&#xff08;3&#xff09;常量指针和指针常量的特性 2.结构体内存分配&#xff08;4&#xff09;位段的内存分配计算 3.完善程序…

【事务】事务的特性、并行事务有什么问题、事务的隔离级别等重点知识汇总

目录 事务的四大特性 并行事务会引发什么问题&#xff1f; 事务的隔离级别 事务的四大特性 原子性&#xff1a;一个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。事务在执行过程中发生错误&#xff0c;会被恢复…

目标检测算法改进系列之Backbone替换为EfficientFormerV2

EfficientFormerV2 随着视觉Transformers&#xff08;ViTs&#xff09;在计算机视觉任务中的成功&#xff0c;最近的技术试图优化ViT的性能和复杂性&#xff0c;以实现在移动设备上的高效部署。研究人员提出了多种方法来加速注意力机制&#xff0c;改进低效设计&#xff0c;或…

如何测试接口?首先你得知道如何开发接口。

接口测试&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。&#xff08;来自某百科&a…

最全的QgraphicsEffect设置

在Qt中&#xff0c;QGraphicsEffect有四个子类&#xff0c;分别为QGraphicsBlurEffect, QGraphicsColorizeEffect, QGraphicsDropShadowEffect, and QGraphicsOpacityEffect&#xff0c;用于实现模糊、着色、阴影、透明度功能 下面就是对这四种功能以及效果做测试 1.QGraphicsB…

服务器搭建(TCP套接字)-libevent版(服务端)

Libevent 是一个开源的事件驱动库&#xff0c;用于开发高性能、并发的网络应用程序。它提供了跨平台的事件处理和网络编程功能&#xff0c;具有高性能、可扩展性和可移植性。下面详细讲解 Libevent 的主要组成部分和使用方法。 一、事件基础结构&#xff08;event_base&#x…

26530-2011 地理标志产品 崂山绿茶

声明 本文是学习GB-T 26530-2011 地理标志产品 崂山绿茶. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了崂山绿茶地理标志产品的术语和定义、保护范围、分类、等级和实物标准样、要求、试 验方法、检验规则、标志、标签、包装、…