单例模式(Singleton Pattern) - 指南
目录
一、单例模式(Singleton Pattern)
单例模式(Singleton Pattern)是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这种模式适用于需要全局唯一对象的场景,例如配置管理、线程池、日志记录器等。
例如,在某个服务器程序中,配置信息存储在文件中。这些数据由一个单例对象统一读取,然后服务进程中的其他对象通过该单例对象获取配置。这种方式有效简化了复杂环境下的配置管理。
单例模式主要有两种实现方式:饿汉模式(Eager Initialization)和懒汉模式(Lazy Initialization)。
二、单例模式的核心特点
私有化构造函数和析构函数,防止外部直接实例化。
删除拷贝构造函数和赋值运算符,禁止复制或赋值实例。
提供一个静态方法获取唯一实例。
三、饿汉模式(Eager Singleton)
饿汉模式在程序启动时就创建单例对象,无论后续是否使用。由于实例已提前创建,因此在多线程环境下无需加锁,避免了资源竞争,性能较高。但可能会增加程序启动时间,如果实例未使用也会造成资源浪费。
1、示例代码
class Singleton {
private:
static Singleton _eton; // 静态成员变量声明
Singleton() : _data(99) { // 私有构造函数
std::cout << "单例对象构造!\n";
}
Singleton(const Singleton&) = delete; // 删除拷贝构造函数
private:
int _data;
public:
static Singleton &getInstance() { // 获取单例的静态方法
return _eton;
}
int getData() { return _data; } // 获取数据的公共方法
};
Singleton Singleton::_eton; // 在main函数之前就完成初始化
int main() {
std::cout << Singleton::getInstance().getData() << std::endl;
return 0;
}

2、代码概述
这是一个使用 “饿汉式” 实现的单例模式。其核心思想是:在程序启动时(main 函数运行前)就完成单例对象的初始化,之后无论调用多少次 getInstance,返回的都是这个预先创建好的唯一实例。
3、逐行语法讲解
1. 类定义部分
class Singleton {
private:
// 1. 静态成员变量声明
static Singleton _eton;
static Singleton _eton;:这行代码声明了一个静态成员变量_eton,类型是Singleton类本身。static关键字:表示该成员变量属于类本身,而不是属于任何一个类的对象。所有Singleton类的对象(虽然这个类不允许创建其他对象)共享这一个变量。它在内存中只有一份副本。
// 2. 私有构造函数
Singleton() : _data(99) {
std::cout << "单例对象构造!\n";
}
Singleton():这是类的构造函数。私有化构造函数 (
private):这是实现单例模式的最关键一步。将构造函数设为私有,意味着禁止在类的外部使用new Singleton()或Singleton obj这种方式来创建对象。这样,对象的创建权完全被类自己掌控。: _data(99):这是成员初始化列表。它在构造函数体执行之前,初始化成员变量_data的值为99。构造函数体内的
cout语句用于演示对象确实只被构造一次。
// 3. 删除拷贝构造函数
Singleton(const Singleton&) = delete;
Singleton(const Singleton&) = delete;:这行代码显式删除 (delete) 了拷贝构造函数。为什么需要? 即使构造函数是私有的,理论上仍然可以通过拷贝的方式来“复制”一个对象(例如,在某些编译器行为或友元函数中)。通过
= delete,我们明确告诉编译器:禁止任何形式的拷贝操作。这是现代 C++ 中防止对象拷贝的推荐方式,比将其声明为private而不实现更彻底、更安全。
private:
int _data; // 普通的私有成员变量,用于演示单例对象可以有自己的状态。
public:
// 4. 获取单例的公共静态方法
static Singleton &getInstance() {
return _eton;
}
static Singleton &getInstance():这是一个公共的静态成员函数。static关键字:表示该函数属于类,而不是类的某个特定对象。因此,它可以在不创建类对象的情况下通过类名直接调用(Singleton::getInstance())。返回值
Singleton &:函数返回一个对静态实例_eton的引用。返回引用而不是指针或值是为了:避免拷贝:

浙公网安备 33010602011771号