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

单例用例(C++)简单分析

1-单例模式定义

单例模式是一种创建型设计模式,它确保一个类在程序运行期间只有一个实例存在,并提供一个全局访问点。这个模式在需要全局控制资源(如配置管理、日志系统、线程池等)时非常有用。

 

1.1 单例模式的特殊点

1.私有构造函数:防止外部通过new关键字创建实例。

2.静态实例:通过静态成员变量或静态方法提供全局访问点。

3.防止拷贝构造和赋值操作:防止通过拷贝或赋值创建多个实例。

4.线程安全:在多线程环境下,确保单例的唯一性。

     2-实现

    我们这里实现有两种方式:1  懒汉式;2  饿汉式。

    2.1- 懒汉式单例(Lazy )

    优缺点分析:

    优点
    • 延迟初始化:实例在需要时才被创建,可以节省资源。
    缺点
    • 线程不安全:在多线程环境下,多个线程可能同时调用getInstance(),导致创建多个实例。
    • 性能问题:每次调用getInstance()都需要进行线程同步,影响性能

    代码实现:

    
    class Singleton {
    public:
        // 提供一个全局访问点
        static Singleton* getInstance() {
            // 双重检查锁定,提高性能,并且在加锁前先检查实例是否已经创建,避免不必要的锁开销。
            if (instance == nullptr) {
                lock_guard<mutex> lock(mtx);
                if (instance == nullptr) {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    
        // 防止拷贝构造和赋值操作
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    
    private:
        // 构造函数设为私有,防止外部创建实例
        Singleton() {
            cout << "Singleton instance created." << endl;
        }
    
        // 静态实例指针
        static Singleton* instance;
        // 互斥锁确保在多线程环境下只有一个线程能够创建实例。
        static smutex mtx;
    };
    
    // 初始化静态成员
    Singleton* Singleton::instance = nullptr;
    mutex Singleton::mtx;
    
    // 使用示例
    int main() {
        Singleton* s1 = Singleton::getInstance();
        Singleton* s2 = Singleton::getInstance();
    
        // 检查两个指针是否指向同一个实例
        if (s1 == s2) {
            cout << "s1 and s2 are the same instance." << endl;
        }
        else {
            cout << "s1 and s2 are different instances." << sendl;
        }
    
        return 0;
    }

    2. 饿汉式单例(Eager )

     

    优缺点分析

    优点
    • 线程安全:实例在程序启动时就被创建,避免了多线程环境下的竞争条件。
    • 简单易用:实现简单,不需要额外的同步机制。
    缺点
    • 资源浪费:如果实例在程序运行期间从未被使用,会浪费内存资源。
    • 启动时间增加:在实例创建过程中,如果初始化过程复杂,会增加程序的启动时间。

    代码实现: 

    class Singleton {
    public:
        // 提供一个全局访问点
        static Singleton& getInstance() {
            return instance;
        }
    
        // 防止拷贝构造和赋值操作
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    
    private:
        // 构造函数设为私有,防止外部创建实例
        Singleton() {
            cout << "Singleton instance created." << endl;
        }
    
        // 静态实例在程序启动时就会被创建,静态存储区保证线程安全
        static Singleton instance;
    };
    
    // 初始化静态成员
    Singleton Singleton::instance;
    
    // 使用示例
    int main() {
        Singleton& s1 = Singleton::getInstance();
        Singleton& s2 = Singleton::getInstance();
    
        // 检查两个引用是否指向同一个实例
        if (&s1 == &s2) {
            cout << "s1 and s2 are the same instance." << endl;
        }
        else {
            cout << "s1 and s2 are different instances." << endl;
        }
    
        return 0;
    }

    如果有错误还请评论区纠正 

     

     

     

    相关文章:

  1. list的常见接口使用
  2. 榕壹云在线商城系统:基于THinkPHP+ Mysql+UniApp全端适配、高效部署的电商解决方案
  3. 【AI News | 20250411】每日AI进展
  4. maven导入本地jar示例
  5. KWDB创作者计划—KWDB关系库与时序库混搭
  6. SQL 外键(Foreign Key)详细讲解
  7. NHANES指标推荐:aMED
  8. Docker镜像如何导出与导入:实现跨机器共享的最佳实践
  9. LeeCode 409.最长回文串
  10. C++ 学习资源整理
  11. 【C++游戏引擎开发】第14篇:视图空间与相机坐标系
  12. MySQL 进阶 - 2 ( 12000 字详解)
  13. C++ Cereal序列化库的使用
  14. C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any
  15. java.lang.OutOfMemoryError: GC overhead limit exceeded如何解决
  16. 《Python星球日记》第23天:Pandas基础
  17. AGI|AutoGen入门食用手册,搭建你的智能体流水线
  18. Position属性实现元素精准定位
  19. source insight编码对齐与中文乱码问题以及CRT中文乱码处理
  20. 基于支持向量回归(SVR)的空气质量预测
  21. 合肥企业网站/最新新闻播报
  22. 建材营销型的网站/推广关键词排名查询
  23. 通州网站建设全包/潍坊做网站哪家好
  24. 广告网站素材/云南网络推广公司排名
  25. 淮安做网站建设的网络公司/整站优化外包服务
  26. 《网站开发课程设计》设计报告/网站制作费用一览表