单例模式的实现方法

发布于:2025-05-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

        单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点这种模式在需要控制对资源(如配置对象、线程池、缓存等)的访问时特别有用。        

一、单例模式的实现方式

  1. 懒汉模式(Lazy Initialization)

    • 延迟初始化:类的第一个实例在第一次被使用时创建。

    • 线程安全:通过双重检查锁定(Double-Checked Locking)来确保线程安全。

    • 性能:由于延迟初始化,可以减少不必要的对象创建,从而提高性能。

      class Singleton {
      public:
          static Singleton* getInstance() {
              if (_instance == nullptr) {
                  std::lock_guard<mutex> lock(_mutex);
                  if (_instance == nullptr) {
                      _instance = new Singleton();
                  }
              }
              return _instance;
          }
      
      private:
          Singleton() {}  // 私有构造函数,防止直接实例化
          ~Singleton() {}  // 私有析构函数,确保正确清理
      
      private:
          static Singleton* _instance;  // 静态实例
          static std::mutex _mutex;  // 互斥锁
      };
  2. 饿汉模式(Eager Initialization)

    • 立即初始化:类的第一个实例在程序启动时就创建。

    • 线程安全:通常不需要额外的同步机制,因为实例在程序启动时就创建了。

    • 性能:可能会因为提前创建实例而增加一些开销,但如果实例创建是轻量级的,这可能不是问题。

      class Singleton {
      public:
          Singleton() {}  // 私有构造函数,防止直接实例化
      
          static Singleton& getInstance() {
              static Singleton instance(_instance);
              return instance;
          }
      
      private:
          Singleton() {}  // 私有构造函数,防止直接实例化
          static Singleton _instance;  // 静态实例
      };

        在饿汉模式中,实例在第一次调用 getInstance 方法时创建,而在饿汉模式中,实例在类加载时就创建。选择哪种模式取决于具体需求和上下文。饿汉模式可以节省资源,但如果初始化顺序很重要,或者需要确保在多线程环境中安全地创建实例,饿汉模式可能更合适。 


网站公告

今日签到

点亮在社区的每一天
去签到