C++ | 单例设计模式(懒汉式单例模式源码|饿汉式单例模式)

点击上方"蓝字"关注我们

01、概念

>>>

单例设计模式 (Singleton Pattern)是一种创建型设计模式 ,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于需要在整个应用程序中共享一个对象的场景,例如配置管理、日志记录、数据库连接池等。

02、场景

>>>

应用场景

  1. 配置管理:应用程序的配置信息通常只需要一个实例来管理,避免多个配置实例导致数据不一致。

  2. 日志记录:日志记录器通常只需要一个实例,以便所有模块都能记录到同一个日志文件中。

  3. 数据库连接池:数据库连接池只需要一个实例来管理数据库连接,避免资源浪费。

  4. 线程池:线程池只需要一个实例来管理线程的创建和销毁。

03、多线程如何处理到单例模式 ?

>>>

在多线程环境中,单例模式的实现需要考虑线程安全问题。如果不加以处理,可能会导致多个线程同时创建多个实例。常见的解决方案是使用双重检查锁定 (Double-Checked Locking)或使用C++11引入的std::call_once来确保线程安全。

04、懒汉式单例模式(线程安全)

>>>

std::unique_ptr 是 C++11 引入的一种智能指针,用于管理动态分配 的对象,并确保在指针超出作用域时自动释放资源。std::unique_ptr 具有独占所有权,即同一时刻只能有一个 std::unique_ptr 指向某个对象。

std::unique_ptr 的特点

  1. 独占所有权 :std::unique_ptr 不能被复制,只能通过移动语义(std::move)转移所有权。

  2. 自动释放资源 :当 std::unique_ptr 超出作用域时,它会自动调用析构函数并释放所管理的对象。

  3. 轻量级 :std::unique_ptr 的实现非常轻量级,通常只包含一个指针。

在单例模式中的应用

在单例模式中使用 std::unique_ptr 可以确保单例实例在程序结束时自动释放,避免内存泄漏。

复制代码
// 懒汉式单例模式(线程安全)#include <iostream>#include <mutex>#include <memory>​class Singleton {public:    // 获取单例实例    static Singleton& getInstance() {        std::call_once(initFlag, initSingleton);        return *instance;    }​    // 禁止拷贝和赋值    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;​private:    // 私有构造函数    Singleton() {        std::cout << "Singleton instance created." << std::endl;    }​    // 初始化单例实例    static void initSingleton() {        instance.reset(new Singleton());    }    // 静态成员变量    static std::unique_ptr<Singleton> instance;    // 静态成员变量初始化标志    static std::once_flag initFlag;};​// 静态成员变量初始化std::unique_ptr<Singleton> Singleton::instance;std::once_flag Singleton::initFlag;​int main() {    // 获取单例实例    Singleton& s1 = Singleton::getInstance();    Singleton& s2 = Singleton::getInstance();​    // s1 和 s2 是同一个实例    if (&s1 == &s2) {        std::cout << "Same instance." << std::endl;    }​    return 0;}

05、饿汉式单例模式(线程安全)

>>>

复制代码
// 饿汉式单例模式(线程安全)#include <iostream>​class Singleton {public:    // 获取单例实例    static Singleton& getInstance() {        static Singleton instance;        return instance;    }​    // 禁止拷贝和赋值    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;​private:    // 私有构造函数    Singleton() {        std::cout << "Singleton instance created." << std::endl;    }};​int main() {    Singleton& s1 = Singleton::getInstance();    Singleton& s2 = Singleton::getInstance();​    // s1 和 s2 是同一个实例    if (&s1 == &s2) {        std::cout << "Same instance." << std::endl;    }​    return 0;}

06、区别

>>>

懒汉式 和饿汉式 是两种常见的实现方式,懒汉式 在第一次使用时才创建实例,而饿汉式则在程序启动时就创建实例。

总结

>>>

创建型模式(Creational Patterns)

| 模式名称 | 描述|

| 单例模式(Singleton) | 确保一个类只有一个实例,并提供一个全局访问点。|

| 工厂方法模式(Factory Method) | 定义一个创建对象的接口,但由子类决定实例化哪个类。|

| 抽象工厂模式(Abstract Factory) | 提供一个接口,用于创建相关或依赖对象的家族,而不指定具体的类。|

| 建造者模式(Builder) | 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。|

| 原型模式(Prototype) | 通过复制现有对象来创建新对象,而不是通过实例化类。|

故我在

点击下方卡片 关注我

↓↓↓

相关推荐
悠仁さん2 小时前
【C++】AVL 树
c++
wuminyu3 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说3 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang3 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
充值内卷5 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
樱花树下的数学喵7 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
AI吃大瓜8 小时前
指针压力表读数3:C/C++实现指针压力表读数(可实时检测)
c++·指针读数·指针压力表·压力表自动读数·压力表读数
-银雾鸢尾-8 小时前
两数之和-C++实现
c++·算法
j7~8 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
jimy18 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++