C++设计模式之单例模式

server/2025/3/6 13:07:52/
1.介绍

        单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。其核心思想是将类的实例化过程进行严格控制,使得在整个程序运行期间,该类只能创建一个对象实例。这样做的好处是可以避免多个实例带来的资源浪费和数据不一致问题,同时方便对这个唯一实例进行全局访问。它常用于需要全局唯一对象的场景,如配置管理、日志记录、数据库连接池等。

2.单例模式的关键点

        1.私有构造函数:防止外部直接实例化。

        2.静态实例:类内部维护一个静态实例。

        3.全局访问点:通过静态方法提供实例访问。

3.单例模式的实现方式

        (1)懒汉式。实例在第一次使用时创建,延迟加载。

class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态实例指针static Singleton* instance;public:// 全局访问点static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}void doSomething() {// 示例方法}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;

        问题:非线程安全,多线程环境下可能创建多个实例。

        (2)饿汉式。类加载时即创建实例,避免多线程问题。

class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态实例static Singleton instance;public:// 全局访问点static Singleton* getInstance() {return &instance;}void doSomething() {// 示例方法}
};// 初始化静态成员变量
Singleton Singleton::instance;

        (3)双重检查锁。结合懒汉式和同步锁,确保线程安全且高效。

#include <mutex>class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态实例指针static Singleton* instance;static std::mutex mtx;public:// 全局访问点static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new Singleton();}}return instance;}void doSomething() {// 示例方法}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

        优点:线程安全且仅在第一次访问时同步。

        (4)Meyer's Singleton(静态局部变量)利用C++的静态局部变量特性,实现线程安全的单例模式

class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;public:// 全局访问点static Singleton& getInstance() {static Singleton instance;return instance;}void doSomething() {// 示例方法}
};

        优点:线程安全(C++11 及以上标准保证静态局部变量的线程安全性)。延迟加载,代码简介。

        (5)智能指针单例模式。使用share_ptr或unique_ptr管理单例实例,避免内存泄漏。

#include <memory>
#include <mutex>class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态智能指针实例static std::shared_ptr<Singleton> instance;static std::mutex mtx;public:// 全局访问点static std::shared_ptr<Singleton> getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = std::shared_ptr<Singleton>(new Singleton());}}return instance;}void doSomething() {// 示例方法}
};// 初始化静态成员变量
std::shared_ptr<Singleton> Singleton::instance = nullptr;
std::mutex Singleton::mtx;

        优点:使用智能指针自动管理内存,避免手动释放。

4.总结
  • 推荐使用 Meyer's Singleton(静态局部变量),简洁且线程安全。

  • 如果需要动态内存管理,可以使用智能指针单例模式

  • 在多线程环境下,务必确保线程安全,可以使用双重检查锁静态局部变量

如有错误,敬请指正!!!


http://www.ppmy.cn/server/172875.html

相关文章

在阿波罗自动驾驶框架中, 全局路径规划用什么算法

嗯&#xff0c;用户问的是在阿波罗自动驾驶框架中&#xff0c;全局路径规划使用什么算法。我需要仔细看一下提供的参考内容&#xff0c;找出相关的信息。 首先&#xff0c;我记得在参考内容里有一篇提到全局路径规划使用A算法。比如在《自动驾驶系统01-百度阿波罗学习笔记》里…

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时&#xff0c;如何每个组件都去import导入组件&#xff0c;大大降低了开发效率&#xff0c;如果全局一次性注册会增加项目体积&#xff0c;那么如何实现既不局部引入&#xff0c;也不全局注册&#xff1f; 2.在element-plus官网看到有说明…

如何结合NLP(自然语言处理)技术提升OCR系统的语义理解和上下文感知能力?

光学字符识别&#xff08;OCR&#xff09;技术能够快速从文档、图像中提取文本信息&#xff0c;目前已经广泛应用于金融、教育、医疗、物流等领域。然而&#xff0c;传统OCR技术的功能主要集中在字符提取和简单的结构化输出上&#xff0c;难以处理复杂场景中涉及的语义理解与上…

机器学习基础——数值计算

数值计算是机器学习领域的三驾马车之一&#xff0c;另外两个是线性代数和概率论&#xff0c;这三门数学基础性学科既是入门数据挖掘行业的门槛也是机器学习从业人员技术能力提升的阶梯。之前的文章已经介绍了线性代数和概率论相关的内容&#xff0c;今天本数据分析狮就分享一下…

FcDesigner页面样式错乱/功能不正常解决办法

form-create-designer 是一款开源的低代码表单设计器&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 源码地…

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 &#xff08;每一个数可以用四个…

【Java学习】String类变量

面向对象系列七 一、String类似复刻变量 1.似复刻变量 1.1结构 1.2常量池检查 1.3构造方法 1.4""形式 1.5引用 2、字符数组 2.1不可变性 2.2常创性 二、String类变量里的方法 1.获取 1.1引用获取&#xff1a; 1.2字符获取&#xff1a; 1.3数组获取 1.…