全局数据 与 singleton 类的选择

2024-05-28 13:12
文章标签 数据 全局 选择 singleton

本文主要是介绍全局数据 与 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 instancestatic mutex m_mutex; // lock for thread-safeint 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: %.cppg++ $< -c -o $@ex: ex.o singleton.og++ $^ -o $@
.PHONY: clean
clean:-rm -rf ex.o ex singleton.o

编译运行:

这篇关于全局数据 与 singleton 类的选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010659

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja