设计模式 : 单例模式笔记

文章目录

一.单例模式

  • 一个类只能创建一个对象,这样的类的设计模式就称为单例模式,该模式保证系统中该类只能有一个实例(并且父子进程共享),一个很典型的单例类就是C++STL的内存池
  • C++单例模式的基本设计思路:
    • 私有化构造函数,删除默认的拷贝构造函数和赋值运算符重载防止对象被直接创建和拷贝
    • 单例对象的内存资源可以交给操作系统来释放,也可以自定义析构函数来完成特殊操作

二.单例模式的两种实现方式

饿汉模式

  • 饿汉单例类在程序进入主函数之前就创建出唯一的实例
cpp 复制代码
//饿汉单例模式
class HungerSingleton
{
public:
	//定义一个可以访问单例对象的静态接口
	static HungerSingleton* Getinstance()
	{
		return &singleObj;
	}
private:
	//构造函数私有化,防止对象被直接创建
	HungerSingleton() { cout << "单例对象创建" << endl; }
	//删除拷贝接口,防止对象被拷贝
	HungerSingleton(const HungerSingleton& single) = delete;
	HungerSingleton& operator=(const HungerSingleton& single) = delete;

private:
	//定义静态区的HungerSingleton成员
	static HungerSingleton singleObj;
	//也可以定义成指针,初始化时在堆上创建
	//static HungerSingleton* singleObj;
};
//初始化类的静态成员
HungerSingleton HungerSingleton::singleObj;
//初始化时在堆上创建
//HungerSingleton * HungerSingleton::singleObj = new HungerSingleton;
  • HungerSingleton的静态成员变量是自身类型的对象(或指针),类的静态成员变量在进入主函数之前就完成初始化,由于构造函数被私有化,因此在程序运行过程中无法再创建该类的对象
  • 饿汉单例模式的优势:
    • 由于子进程只能在主函数中被创建,因此饿汉单例类不存在线程安全问题,无需与其他线程的类竞争系统资源,在多线程高并发环境下能够较为高效地执行任务
  • 饿汉单例模式的劣势:
    • 如果一个程序中有多种饿汉单例类,我们无法控制它们的初始化顺序
    • 饿汉单例类会拖慢程序的启动速度,而且即便用不到该类也会创建一个实例,可能造成内存浪费

懒汉模式

  • 懒汉单例类在程序进入主函数之后由后续代码决定是否创建实例
cpp 复制代码
//懒汉单例模式
class LazySingleton
{
public:
	//定义一个可以访问单例对象的静态接口
	static LazySingleton* Getinstance()
	{
		//若singleObj为空指针则创建单例对象
		if (singleObj == nullptr)
		{
			singleObj = new LazySingleton;
		}
		return singleObj;
	}
private:
	//构造函数私有化,防止对象被创建
	LazySingleton() { cout << "单例对象创建" << endl; }
	//删除拷贝接口,防止对象被拷贝
	LazySingleton(const LazySingleton& single) = delete;
	LazySingleton& operator=(const LazySingleton& single) = delete;

private:
	//定义成静态成员指针,初始化时在堆上创建
	static LazySingleton* singleObj;
};
//初始化时设置成空指针
LazySingleton * LazySingleton::singleObj = nullptr;
  • LazySingleton类在第一次调用Getinstance()成员接口时才会创建实例
  • 懒汉单例模式的优势:
    • 可以控制多种懒汉单例类对象的初始化顺序,并且需要用到的时候才创建,避免了内存浪费
  • 懒汉单例模式的劣势:
    • 在多线程环境中存在线程安全问题,需要加锁
相关推荐
yi0113 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
志尊宝4 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
weixin_448119946 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
要开心吖ZSH7 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
咖啡忍者8 小时前
【SAP】程制造生产计划PP-PI(Production Planning for Process Industries)
笔记
Titan20249 小时前
MySQL索引学习笔记
笔记·学习·mysql
zhangrelay9 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
AOI小白新手上路9 小时前
VDMamba·AutoDL 复现笔记 · 学习笔记
笔记·学习
ACP广源盛1392462567311 小时前
USB3.0 高速信号切换方案评估,LH3412 @ACP双通道差分开关硬件选型笔记
笔记·硬件架构·硬件工程·国产芯片·开关
自不量力的A同学11 小时前
Goldfish Scheme v18.11.39 发布了:迈向现代宏系统与多核并发
笔记