21xrx.com
2025-06-29 20:39:53 Sunday
登录
文章检索 我的文章 写文章
C++单例模式的实现
2023-07-03 02:19:16 深夜i     13     0
C++ 单例模式 实现

C++单例模式是一种设计模式,它确保了在程序的生命周期中,一个类只被实例化一次,并提供了一个全局访问点。单例模式有许多应用场景,比如配置文件管理、线程池、日志记录器等。

在C++中实现单例模式,有多种方法。以下是其中的一些实现方式:

1.懒汉式

懒汉式是最常用的单例模式实现方式之一。在该方式中,单例实例是在第一次调用getInstance()方法时才被创建。具体实现如下:

class Singleton {
public:
  static Singleton* getInstance(){
    if(instance==NULL){
      instance = new Singleton();
    }
    return instance;
  }
  
private:
  Singleton(){};
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
  
  static Singleton* instance;
};
Singleton* Singleton::instance=NULL;

上述代码中,当getInstance()方法被调用时,首先判断实例是否已被创建,如果没有,则创建一个新的实例。对于多线程环境,可以使用加锁的方式来保证线程安全。

2.饿汉式

饿汉式是在程序启动时就创建单例实例。具体实现如下:

class Singleton {
public:
  static Singleton* getInstance()
    return instance;
  
  
private:
  Singleton(){};
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
  
  static Singleton* instance;
};
Singleton* Singleton::instance = new Singleton();

上述代码中,使用静态成员变量在程序启动时即创建了一个实例,从而保证了线程安全。不过该方式存在一定的资源浪费,因为实例被创建出来,可能并不会被立即使用。

3.双重检查锁

双重检查锁是一种既能实现懒加载,又能保证线程安全的单例模式实现方式。具体实现如下:

class Singleton {
public:
  static Singleton* getInstance(){
    if(instance==NULL){
      std::lock_guard <std::mutex> lk(m_mutex);
      if(instance==NULL){
        instance = new Singleton();
      }
    }
    return instance;
  }
  
private:
  Singleton(){};
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
  
  static Singleton* instance;
  static std::mutex m_mutex;
};
Singleton* Singleton::instance=NULL;
std::mutex Singleton::m_mutex;

该方式使用了双重检查的方式来保证线程安全。首先判断实例是否已经被创建,若未创建,则使用互斥锁保证线程安全,再次判断实例是否已经存在。如果不存在,再创建实例。使用双重检查的方式可以避免不必要的互斥锁开销,提高了代码的执行效率。不过该方式相对来说,实现较为复杂。

总之,单例模式在C++中的实现方式存在多种选择,开发者可以根据实际需求进行选择。在实现单例模式时,也需要注意线程安全问题。

  
  

评论区