单例模式 (Singleton)。单例的核心思想是:在整个应用程序的生命周期中,某个类只存在一个实例。
什么是单例? (The Concept)#
- 核心定义:单例是只有单一实例的类。
- 应用场景:当你需要一个全局访问点来管理某些资源时(如随机数生成器、渲染器、数据库连接等)非常有用。
- 争议性:单例本质上是“披着类外壳的全局变量”,在某些开发者眼中这被视为一种“反模式”,但 Cherno 认为在特定场景下它非常高效。
把类当做命名空间来调用某些函数 - 如果你只有一个实例,你那实际有的就只是一组数据,以及一些配套功能
- 替代单例:属于某个命名空间的函数、全局变量、某个与源文件关联的静态变量、特定的C++源文件
- 单例的生命周期和应用程序的一样
基础实现逻辑 (Basic Implementation)#
单例模式主要依靠以下三个步骤实现:
- 私有化构造函数:通过
private构造函数防止外部通过new或直接声明来创建新实例。 - 禁用拷贝构造:删除拷贝构造函数(
ClassName(const ClassName&) = delete;),确保无法通过复制来产生第二个实例。 - 静态访问点:提供一个静态方法(通常命名为
Get()),返回那个唯一的静态实例。
#ifdef LY_EP82
#include <iostream>
class Singleton
{
public:
Singleton(const Singleton&) = delete;//禁止拷贝
static Singleton& Get()
{
return s_Instance;
}
void Function() {
std::cout << "Function" << std::endl;
}
private:
float m_Member = 3.4f;
Singleton() {}
static Singleton s_Instance;
};
//定义
//1. 在全局/静态内存区分配 sizeof(Singleton) 字节的空间。
//2. 在程序启动时,自动调用 Singleton 的构造函数来初始化这块空间。
//由于你使用了作用域解析符 Singleton::,编译器认为这行代码依然属于 Singleton 类的范畴
Singleton Singleton::s_Instance;
int main()
{
//这种写法,调用了Singleton类的复制构造函数,
//拷贝了所有成员,并创建了一个新的实例(违背单例本意)
//类定义中Singleton(const Singleton&) = delete;//禁止拷贝
//Singleton instance = Singleton::Get();
auto& instantce = Singleton::Get();
Singleton::Get().Function();
std::cin.get();
return 0;
}
#endif现代 C++ 的最佳实践 (The Best Way)#
Cherno 演示了最简洁且线程安全的单例写法(C++11 及更高版本):


