【C++】单例模式(饿汉模式、懒汉模式)

本文介绍了设计模式的概念及其目的,重点讲解了C++中的单例模式,包括饿汉模式和懒汉模式。饿汉模式在程序启动时创建唯一实例,简单但可能增加启动负载;懒汉模式则在首次使用时创建对象,无启动负载,但实现相对复杂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是单例模式?

首先先来了解一下设计模式。设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,一共有23种经典设计模式。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编
写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

单例模式

单例模式是设计模式中最常用的一种模式。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。

 

单例模式的两种实现模式

  • 饿汉模式

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

优点:简单

<think>好的,用户想了解C++单例模式饿汉式实现方。首先,我需要回顾一下单例模式的基本概念,确保自己理解正确。单例模式确保一个类只有一个实例,并提供全局访问点。饿汉式是其中一种实现方,特点是类加载时就初始化实例,这样可能会提前占用资源,但线程安全。 接下来,我需要参考提供的引用内容。引用[1]提到饿汉式懒汉的区别,引用[3]说明饿汉式是静态初始化,类加载时就创建实例,线程安全。而懒汉需要处理多线程问题。用户明确问的是饿汉式,所以重点在如何静态初始化。 现在,构造回答的结构。首先解释饿汉式的定义特点,然后给出具体的代码示例。需要注意C++中的静态成员变量静态函数的实现方。根据引用[2],实例应该用static修饰,并且构造函数私有化,防止外部实例化。 代码部分,需要展示类的定义,包括私有的静态实例指针,私有的构造函数,公有的获取实例方法。同时,要在类外初始化静态成员,确保在程序开始前就创建实例。这部分容易出错,需要确认语法正确,比如静态成员在类外的初始化方。 另外,要强调饿汉式的优缺点。优点是线程安全,因为实例在main函数执行前就已经初始化,不需要考虑多线程竞争。缺点是可能造成资源浪费,如果实例未被使用,或者初始化耗时较长影响程序启动速度。 可能还需要对比懒汉,帮助用户理解不同场景下的选择。但用户的问题只针对饿汉式,所以简要提及即可,避免信息过载。 检查是否有遗漏点,比如拷贝构造函数赋值操作符需要禁用,防止通过拷贝创建新实例。这也是单例模式常见的注意点,应该在代码中体现为删除这两个函数。 最后,确保回答符合用户的要求:结构清晰,步骤详细,引用正确。引用[3]提到饿汉式是静态初始化,线程安全,需要引用到相关部分。同时,生成相关问题,如优缺点、线程安全、与懒汉的对比等,帮助用户进一步学习。</think>### C++单例模式饿汉式实现详解 饿汉式单例模式的核心特征是**在类加载阶段就完成实例化**,通过静态成员变量直接初始化单例对象。这种方具有**天然线程安全**特性,适用于初始化耗时短且需要频繁访问的场景[^3]。 #### 实现步骤分解 1. **构造函数私有化**:禁止外部直接实例化 2. **声明静态实例指针**:存储唯一实例 3. **定义静态访问方法**:提供全局访问接口 4. **禁用拷贝赋值**:防止意外复制实例 #### 完整代码示例 ```cpp class Singleton { private: // 静态成员变量声明(类内) static Singleton* instance; // 禁用默认构造函数 Singleton() = default; // 禁用拷贝赋值 Singleton(const Singleton&) = delete; void operator=(const Singleton&) = delete; public: // 全局访问点 static Singleton* getInstance() { return instance; } }; // 静态成员变量初始化(类外) Singleton* Singleton::instance = new Singleton(); ``` #### 关键特性解析 $$ \text{内存分配时间} \quad T_{alloc} = \text{程序启动时} $$ 1. **线程安全性**:实例在`main()`函数执行前完成初始化,规避了多线程竞争问题 2. **资源占用**:即使从未使用也会占用内存空间 3. **访问效率**:直接返回已存在的指针,时间复杂度为$O(1)$ #### 应用场景建议 - 需要高频访问的核心管理器(如内存池、日志系统) - 初始化耗时短(<50ms)的基础服务组件 - 对线程安全有严格要求的系统级服务
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值