• 单例设计模式c++


    什么是单例模式?

    单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性

    单例模式分类

    单例模式可以分为懒汉式饿汉式,两者之间的区别在于创建实例的时间不同

    • 懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
    • 饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)

    单例类特点

    • 构造函数和析构函数为private类型,目的禁止外部构造和析构
    • 拷贝构造和赋值构造函数为private类型,目的是禁止外部拷贝和赋值,确保实例的唯一性

    单例类的结构

    • 一个public的获取指向唯一的实例对象的指针的函数GetInstance()
    • 构造函数析构函数设为private,禁止外部构造和析构
    • 拷贝构造和赋值操作符重载函数设为private类型,禁止外部拷贝和赋值,确保实例的唯一性
    • 一个private的static的指向唯一的实例对象的指针

    懒汉模式实现代码

    线程不安全版本:

    1. //线程不安全的懒汉模式
    2. class singleClass {
    3. public:
    4. static singleClass* getinstance()//对外的接口(方法),静态成员函数调用静态成员变量
    5. {
    6. if (instance == nullptr)
    7. {
    8. instance = new singleClass();
    9. }
    10. return instance;
    11. };
    12. private:
    13. static singleClass* instance;//静态成员变量,类内声明,类外初始化
    14. singleClass() {} //构造函数属性设置为私有
    15. singleClass(const singleClass & sc) {} //拷贝构造函数也需要设置为私有
    16. };
    17. singleClass* singleClass::instance=nullptr;//初始化静态变量
    1. //线程安全的懒汉模式
    2. class lhsingleClass {
    3. public:
    4. static lhsingleClass* getinstance()
    5. {//双重锁模式
    6. if (instance == nullptr)
    7. {//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回
    8. //进入后加锁
    9. i_mutex.lock();
    10. if (instance == nullptr)
    11. {//再判断一次,确保不会因为加锁期间多个线程同时进入
    12. instance = new lhsingleClass();
    13. }
    14. i_mutex.unlock();//解锁
    15. }
    16. return instance;
    17. }
    18. private:
    19. static lhsingleClass* instance;
    20. static mutex i_mutex;//锁
    21. lhsingleClass(){}
    22. lhsingleClass(const lhsingleClass& sc) {}//拷贝构造函数也需要设置为私有
    23. };
    24. lhsingleClass* lhsingleClass::instance=nullptr;
    25. mutex lhsingleClass::i_mutex;//类外初始化

    饿汉模式实现代码

    1. //饿汉模式:不管用不用得到,都构造出来。本身就是线程安全的
    2. class ehsingleClass {
    3. public:
    4. static ehsingleClass* getinstance()
    5. {
    6. return instance;
    7. }
    8. private:
    9. static ehsingleClass* instance;//静态成员变量必须类外初始化,只有一个
    10. ehsingleClass() {}
    11. };
    12. ehsingleClass* ehsingleClass::instance = new ehsingleClass();
    13. //类外定义,main开始执行前,该对象就存在了

  • 相关阅读:
    (附源码)ssm网上零食销售系统 毕业设计 180826
    跨平台UI组件DevExpress XAF v22.1 - 程序集默认面向 .NET 6
    What Makes Pre-trained Language Models Better Zero-shot Learners?
    【打卡】牛客网:BM49 表达式求值(调试很久)
    Allegro Design Entry HDL(OrCAD Capture HDL)元器件管理菜单详细介绍
    EFCore 使用FluntApi配置 全局查询筛选器
    MAYA粒子基础_场
    基于Spring Boot应用JdbcTemplate操作数据库(查增改删)
    孙哥Spring源码第19集
    vnc与windows之间的复制粘贴
  • 原文地址:https://blog.csdn.net/wjjnbclass/article/details/138143439