当前位置: 首页 > article >正文

C++学习 - 03(单例模式)

文章目录

  • 一、概述

一、概述

  BuiltinLed& BuiltinLed::GetInstance() 是一个典型的单例模式(Singleton Pattern)的实现方法。单例模式确保一个类只有一个实例,并提供一个全局访问点。在 C++ 中,单例模式通常通过静态成员函数 GetInstance 来实现,该函数返回类的唯一实例。

1. 单例模式的目的

  • 确保唯一性:确保一个类只有一个实例。
  • 提供全局访问点:提供一个全局访问点,使得任何地方都可以访问这个唯一的实例。

2. BuiltinLed 类的定义
 &emsp假设 BuiltinLed 类是一个管理内置 LED 的类,我们希望在整个程序中只有一个 BuiltinLed 实例。下面是 BuiltinLed 类的一个可能实现:

#include <iostream>

class BuiltinLed
{
    private:
        // 私有构造函数,防止外部直接实例化
        BuiltinLed();
        // 私有析构函数,防止外部删除实例
        ~BuiltinLed();
        // 禁止拷贝构造和赋值操作
        BuiltinLed(const BuiltinLed &) = delete;
        BuiltinLed &operator=(const BuiltinLed &) = delete;
        
    public:
        // static BuiltinLed &GetInstance(); 是一个典型的单例模式实现中的方法声明。这个方法返回一个 BuiltinLed 类的唯一实例,
        // 并且是线程安全的。通过静态局部变量和私有构造函数,确保了类的唯一实例,并且提供了线程安全的全局访问点。这种模式在需
        // 要全局共享资源的场景下非常有用,例如配置管理、日志记录、数据库连接池等。
        #if 0// 方法一
        static BuiltinLed &GetInstance();
        #endif
        // 方法二
        static BuiltinLed &GetInstance()
        {
            static BuiltinLed instance;
            return instance;
        }
        void SetColor(int red, int green, int blue);
        void Blink(int times, int interval);
};

// 私有构造函数,防止外部直接实例化
BuiltinLed::BuiltinLed()
{
    std::cout << "BuiltinLed instance created." << std::endl;
}
// 私有析构函数,防止外部删除实例
BuiltinLed::~BuiltinLed()
{
    std::cout << "BuiltinLed instance destroyed." << std::endl;
}

#if 0 // 方法一
/** ——————————————————————————————————————————————————————————————————————————————
 * @brief 获取实例方法
 * 
 * @return BuiltinLed& 
—————————————————————————————————————————————————————————————————————————————————*/
BuiltinLed& BuiltinLed::GetInstance()
{
    static BuiltinLed instance;
    return instance;
}
#endif


// 成员函数,用于控制 LED
void BuiltinLed::SetColor(int red, int green, int blue)
{
    std::cout << "Set color: R=" << red << ", G=" << green << ", B=" << blue << std::endl;
}
// 成员函数,用于控制 LED
void BuiltinLed::Blink(int times, int interval)
{
    std::cout << "Blink " << times << " times with interval " << interval << " ms." << std::endl;
}

int main()
{
    // 获取 BuiltinLed 的唯一实例
    BuiltinLed &led = BuiltinLed::GetInstance();

    // 使用实例
    led.SetColor(255, 0, 0);
    led.Blink(5, 500);

    return 0;
}

3.解释

  • 静态局部变量
    • 静态局部变量:在 GetInstance 方法中,static BuiltinLed instance; 声明了一个静态局部变量。静态局部变量在第一次访问时初始化,并且在程序的整个生命周期内存在。
    • 线程安全:在 C++11 及更高版本中,静态局部变量的初始化是线程安全的。这意味着即使多个线程同时调用 GetInstance,也只会创建一个 BuiltinLed 实例。
  • 私有构造函数
    • 私有构造函数:BuiltinLed 类的构造函数是私有的,这确保了外界无法通过 new 或其他方式直接创建 BuiltinLed 的实例。只有通过 GetInstance 方法才能获得 BuiltinLed 的唯一实例。
    • 删除拷贝构造函数和赋值操作符:通过删除拷贝构造函数和赋值操作符,确保 BuiltinLed 类的实例不能被复制或赋值,从而保证单例的唯一性。

4.优点

  • 线程安全:由于静态局部变量的初始化是线程安全的,因此 GetInstance 方法是线程安全的。
  • 懒加载:实例在第一次调用 GetInstance 时创建,而不是在程序启动时创建,这可以节省内存。
  • 唯一性:确保 BuiltinLed 类只有一个实例,避免了资源的重复创建和销毁。

5.缺点

  • 单例模式的局限性:单例模式限制了类的灵活性,例如不能通过继承来扩展单例类。
  • 测试困难:单例模式使得单元测试变得更加复杂,因为单例类的状态在测试之间会保留。

http://www.kler.cn/a/406249.html

相关文章:

  • HarmonyOS . 沉浸状态栏使用
  • 树莓派2 安装raspberry os 并修改成固定ip
  • 在Excel中处理不规范的日期格式数据并判断格式是否正确
  • 【java-Neo4j 5开发入门篇】-最新Java开发Neo4j
  • 【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案
  • 跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
  • 蓝队技能-应急响应篇Rookit后门进程提取网络发现隐藏技术Linux杀毒OpenArk
  • MATLAB和C++及Python流式细胞术
  • display: none和visibility: hidden的区别
  • json数据四大加载方式
  • LeetCode:700. 二叉搜索树中的搜索
  • Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码
  • PVE的优化与温度监控(二)—无法识别移动硬盘S.M.A.R.T信息的思考并解决
  • CSS布局学习2
  • 深度学习:计算卷积神经网络中输出特征图尺寸的关键公式
  • 深度剖析Linux进程控制
  • VsCode 插件推荐(个人常用)
  • 【ArcGISPro】根据yaml构建原始Pro的conda环境
  • 【高阶数据结构】LRU Cache
  • Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
  • 网络爬虫——爬虫项目案例
  • 【贪心算法】贪心算法四
  • 泷羽sec-星河飞雪-shell-4
  • 如何利用Java爬虫获得1688店铺详情
  • MySQL数据库-视图的介绍和使用
  • MYSQL——多表查询、事务和索引