单例模式(Singleton Pattern)是一种创建型设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式通常用于管理共享资源,如配置文件、线程池、缓存等。在C++中,创建一个单例模式的类通常涉及到以下几个关键点:
- 私有构造函数:防止外部通过
new
直接创建实例。 - 删除拷贝构造函数和赋值操作符:防止复制单例实例。
- 一个静态实例指针:用于持有单例对象的指针。
- 一个静态方法:用于访问单例实例。
以下是一个简单的C++单例模式实现示例:
#include <iostream>class Singleton {
private:// 私有构造函数Singleton() {}// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;public:// 提供一个全局访问点static Singleton& getInstance() {static Singleton instance; // 局部静态变量return instance;}// 示例方法void doSomething() {std::cout << "Doing something..." << std::endl;}
};int main() {// 获取单例对象并调用其方法Singleton& s1 = Singleton::getInstance();s1.doSomething();// 再次获取单例对象,s2 与 s1 是同一个实例Singleton& s2 = Singleton::getInstance();s2.doSomething();// 验证 s1 和 s2 是否相同std::cout << (&s1 == &s2 ? "s1 and s2 are the same instance." : "s1 and s2 are different instances.") << std::endl;return 0;
}
在这个例子中,Singleton
类有一个私有的构造函数和一个静态方法 getInstance
,该方法返回一个引用到类的唯一实例。我们使用了局部静态变量的技巧来保证线程安全和懒初始化(lazy initialization),即实例在首次访问时创建。
注意,从C++11开始,局部静态变量的初始化是线程安全的。如果你的代码需要在更早的C++标准中运行,或者需要显式的线程控制,你可能需要使用互斥锁(mutexes)或其他同步机制来确保线程安全。
此外,如果你需要支持多态和动态绑定,你可能需要将单例类的析构函数声明为虚函数,但这通常是不必要的,除非你有特定的需求。