全局数据 与 singleton 类的选择

1,singleton 相对于全局数据的优势

使用 Singleton 类相对于全局数据具有以下好处:

1.1. 延迟初始化:Singleton 类可以实现延迟初始化,即在需要时才创建实例,而全局数据在程序启动时就会被初始化。这可以节省资源并提高性能。

1.2. 控制访问:Singleton 类可以提供更好的访问控制,通过提供公共静态方法来访问实例,可以限制对实例的访问方式,避免直接访问全局数据。

1.3. 线程安全:Singleton 类可以实现线程安全的实例化,通过加锁或其他线程安全机制来保证在多线程环境下只创建一个实例,而全局数据可能需要额外的同步机制来保证线程安全。

1.4. 更好的封装:Singleton 类提供了更好的封装性,可以隐藏实例化细节并提供更清晰的接口,而全局数据可能会暴露在整个程序中,导致耦合性增加。

1.5. 易于扩展:Singleton 类可以更容易地扩展和维护,可以在类中添加新的功能和行为,而全局数据可能会导致代码膨胀和难以维护。

总的来说,使用 Singleton 类相对于全局数据可以提供更好的封装、控制访问、线程安全性和延迟初始化等优势,使得代码更加健壮、可维护和可扩展。

2,全局数据相对于singleton的优势

使用全局数据相对于 Singleton 类具有以下一些优势:

2.1. 简单性:全局数据的实现通常比 Singleton 类更简单直接,不需要额外的设计模式和复杂的实现。

2.2. 易于访问:全局数据可以在任何地方直接访问,不需要通过特定的接口或方法来获取实例。

2.3. 更快速的访问:全局数据的访问速度可能会更快,因为不需要额外的方法调用或实例化过程。

2.4. 适用性:在某些情况下,全局数据可能更适合特定的应用场景,例如需要在整个程序中共享的配置信息或状态。

2.5. 少量数据:对于少量数据或简单的应用,全局数据可能是更简单和有效的选择,避免引入不必要的复杂性。

3.结论

尽管全局数据具有一些优势,但在大多数情况下,推荐使用 Singleton 类来管理全局状态和数据,因为 Singleton 类提供了更好的封装、控制访问、线程安全性和延迟初始化等优势,使得代码更加健壮、可维护和可扩展。选择使用全局数据还是 Singleton 类取决于具体的需求和设计考虑。

4,singleton C++  DCL 示例

4.1 示例一

单文件示例

hello_dcl_sing.cpp

#include <iostream>
#include <mutex> 
class Singleton {
private:
    Singleton() {}                             // 私有构造函数
    static Singleton* instance;                // 单例对象指针
    static bool inited;                        // 初始化标志
    static std::mutex mtx;                    // 用于线程同步的互斥锁
						  //
public:
    // 获取单例对象的方法
    static Singleton* getInstance() {
        if (!inited) {                         // 第一次检查,无需同步
            std::lock_guard<std::mutex> lock(mtx); // 同步块
            if (!inited) {                     // 第二次检查,确保线程安全
                instance = new Singleton();    // 安全创建单例对象
                inited = true;                 // 标记已初始化
            }
        }
        return instance;                       // 返回单例对象
    }
 
    // 其他成员函数和方法...
};
 
Singleton* Singleton::instance = nullptr;      // 静态成员初始化
bool Singleton::inited = false;               // 初始化标志默认为false
std::mutex Singleton::mtx;                    // 用于线程同步的互斥锁
 
int main() {
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
 
    if (s1 == s2) {
        std::cout << "Singletons are the same instance." << std::endl;
    }
 
    return 0;
}

编译运行:

        g++  hello_dcl_sing.cpp

        ./a.out

效果图:

4.2 示例二

双文件示例

源码:

singleton.h

// singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>
#include <mutex>

using namespace std;

class Singleton
{
public: 
static Singleton* GetInstance();
void print_info();
private: 
Singleton(int a, int b, int c) {major = a; minor = b; patch = c;} // construction, private
private: 
    static Singleton *m_pSingleton; // pointer points self single instance
    static mutex m_mutex; // lock for thread-safe
    int major;
    int minor;
    int patch;
};

#endif // SINGLETON_H

singleton.cpp

// singleton.cpp
#include "singleton.h"

Singleton *Singleton::m_pSingleton = NULL;
mutex Singleton::m_mutex;

Singleton *Singleton::GetInstance()
{
     if (m_pSingleton == NULL) { 
         std::lock_guard<std::mutex> lock(m_mutex); // self-unlocking 
         if (m_pSingleton == NULL) { 
             m_pSingleton = new Singleton(1, 2, 3); 
         } 
      } 
      return m_pSingleton;
}

void Singleton::print_info()
{
	printf(" major = %d\n minor = %d\n patch = %d\n", major, minor, patch);
}

app 源码

ex.cpp

#include "singleton.h"

int main()
{
	Singleton::GetInstance()->print_info();

	return 0;
}

Makefile

all: ex

%.o: %.cpp
	g++ $< -c -o $@

ex: ex.o singleton.o
	g++ $^ -o $@
.PHONY: clean
clean:
	-rm -rf ex.o ex singleton.o

编译运行:

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

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

相关文章

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件&#xff0c;用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项&#xff0c;用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …

使用html2canvas和jspdf导出pdf包含跨页以及页脚

首先要下载两个文件&#xff0c;一个为html2canvas.min.js&#xff0c;另一个是jspdf.umd.min.js这两个文件分别下载的地址我也附录上&#xff0c;都在官网git&#xff1a; html2canvas.min.js: https://html2canvas.hertzen.com/dist/html2canvas.min.js jspdf.umd.min.js: …

Docker 快速搭建 MongoDB 4.x 集群(一主一从)

目录 1. 生成 mongo-file2. 启动主节点3. 启动从节点4. 配置副本集5. 注意事项 环境&#xff1a;MongoDB 4.0.25&#xff0c;Alma Linux&#xff08;建议使用 Linux&#xff09; 部署的时候是在同一个及其上操作的&#xff0c;实际可以放在不同机器上。 截止到 2024年05月&…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后&#xff0c;大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战&#xff0c;欢迎您在OceanBase社区问答论坛中交流、讨论。此次&#xff0c;《DBA从入门到…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

以太坊现货ETF获批:引发ETH价格暴涨,市场热议达到高潮

2024年5月24日&#xff0c;北京时间&#xff0c;以太坊现货ETF正式获得美国证券交易委员会&#xff08;SEC&#xff09;的批准&#xff0c;成为继比特币之后&#xff0c;美国主权政府承认的又一加密货币基金产品。这一意外的利好消息引发了加密货币市场的狂欢&#xff0c;以太坊…

阳光电源临摹品引发的EMC正向设计思考

画画可以临摹。画电路板临摹的人更多。 抄板&#xff0c;抄的是过去的板子&#xff0c;容易出问题。现在市场竞争激烈&#xff0c;欧美客户对出口产品的标准要求推陈出新&#xff0c;防不胜防。由于市场的竞争&#xff0c;欧洲客户已经意识到EMC电磁兼容的重要性&#xff0c;不…

【PID算法详解】

PID算法 PID算法介绍用途pid数学表达式及其含义P算法D算法I算法 PID总结数学公式转换代码设计实际运用PID代码实现 PID算法介绍 PID控制器是一种广泛应用于工业控制系统的反馈控制器&#xff0c;它通过比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&am…

LeetCode450删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。一般来说&#xff0c;删除节点可分为两个步骤&#xff1…

合约的值类型

基本数据类型&#xff1a;整数、枚举、布尔&#xff08;类似java的数据类型&#xff09;Address、Contract&#xff08;这两种是solidity特有的数据类型&#xff09;Fixed byte array&#xff08;定长字节数组&#xff09; Integer(int/uint) int/uint 以8位字节递增&#xf…

代码随想录算法训练营Day2|977.有序数组的平方、59.螺旋矩阵||、 209.长度最小的子数组

977.有序数组的平方 这道题给出的原数组有两个特点&#xff1a; 1、由小到大 2、有负数有正数 因此&#xff0c;这个数组平方后的数应该是从两头向中间的0减小的&#xff0c;但是两头的大小需要我们用两个指针便历之后去判断大小。在遍历的同时left指针向右走&#xff0c;righ…

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架&#xff0c;它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式&#xff0c;以及用代码示例来解释它们&#xff1a; 一、工厂模式&#xff08;Factory Pattern&#xff…

DIYGW UniApp可视化开发工具:前端开发人员的新宠

在前端开发的领域中&#xff0c;API接口的测试与调试一直是开发人员面临的挑战之一。传统的测试工具虽然能够完成基本的测试任务&#xff0c;但在效率、易用性和直观性方面仍有提升的空间。随着技术的发展&#xff0c;DIYGW UniApp可视化工具应运而生&#xff0c;为开发人员提供…

智慧园区:打造未来城市的新模式

随着城市化进程的加速和科技创新的推动&#xff0c;城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性&#xff0c;是一个亟待解决的问题。在这个背景下&#xff0c;智慧园区作为一种新型的城市发展模式&#xff0c;引起了越来越多的关注和探索。 什么是智慧园区&…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面&#xff0c;登陆管理员账号 &#xff08;测试服务器安装的gitlab&#xff0c;浏览器输入ip或配置的gitlab地址&#xff09; 创建新项目 使用gitlab创建项目 创建一个新项目&#xff08;忽略分组&#xff09; &#xff08;忽略分组&#xff09; 在创建工…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…

全球排名第一的免费开源ERP:Odoo与微信集成的应用场景解析

概述 本文介绍了世界排名第一的开源免费企业应用软件Odoo ERP和企业微信、个人微信的各种对接功能。包括微信登录的对接、微信公众号的对接、微信消息的对接、微信支付的对接、微信打卡的对接、微信小程序的对接。 微信登录的对接 Odoo的登录&#xff0c;除了标准的用户名/密码…

律所电子签章有效吗,怎么操作?

电子签章在很多国家和地区是合法有效的&#xff0c;但其有效性、使用条件和操作流程可能依据具体的法律法规而有所不同。在中国&#xff0c;随着《中华人民共和国电子签名法》的实施&#xff0c;电子签章在满足一定条件下是具有法律效力的。电子签章可以提高合同签订的效率&…