单例模式(Singleton Pattern) - 指南

目录

一、单例模式(Singleton Pattern)

二、单例模式的核心特点

三、饿汉模式(Eager Singleton)

1、示例代码

2、代码概述

3、逐行语法讲解

1. 类定义部分

2. 静态成员变量定义

3. main 函数

4、总结与特点

工作原理

“饿汉式”的优缺点

与其他实现(如“懒汉式”)的对比(后面会讲解)

5、学习中遇到的问题

四、懒汉模式(Lazy Singleton)

1、代码概述

2、逐行语法讲解

1. 类定义部分

2. main 函数

3、“懒汉式” vs. “饿汉式” 对比

五、应用场景举例

六、总结


一、单例模式(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 的引用。返回引用而不是指针或值是为了:

    • 避免拷贝

posted @ 2025-09-16 17:51  yfceshi  阅读(5)  评论(0)    收藏  举报