单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在C++中,单例模式通常用于管理全局资源或共享状态。
以下是C++中实现单例模式的几种常见方式:
- 懒汉式(Lazy Initialization)
懒汉式单例在第一次使用时才创建实例。
非线程安全版本:
class Singleton {
public:
static Singleton& getInstance() {
if (!instance) {
instance = new Singleton();
}
return *instance;
}
// 删除拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {} // 私有构造函数
~Singleton() {} // 私有析构函数
static Singleton* instance; // 静态实例指针
};
Singleton* Singleton::instance = nullptr; // 初始化静态成员
线程安全版本(使用双重检查锁定):
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
if (!instance) {
std::lock_guard<std::mutex> lock(mutex);
if (!instance) {
instance = new Singleton();
}
}
return *instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
~Singleton() {}
static Singleton* instance;
static std::mutex mutex;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
- 饿汉式(Eager Initialization)
饿汉式单例在程序启动时即创建实例,线程安全。
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance; // 静态局部变量,程序启动时初始化
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
~Singleton() {}
};
- Meyer’s Singleton(静态局部变量)
这是C++中最简洁的单例实现方式,利用了静态局部变量的特性(线程安全且懒加载)。
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance; // 静态局部变量,线程安全且懒加载
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
~Singleton() {}
};