设计模式 -- 单例模式

news/2024/12/23 21:01:32 标签: 设计模式, 单例模式

设计模式 -- 单例模式

单例模式

  • 单例模式:确保在整个程序运行期间只有一个类的实例存在,并提供全局访问点。常用于只需要创建一次的对象(如:数据库连接、日志记录器或配置管理器)
    优点:全局唯一实例入口,简化其他模块获取该服务的复杂度;只有一个实例,整个应用程序生命周期中实例始终可用,减少重复创建对象,避免资源浪费等
    缺点:全局可见,增加了系统的耦合性;全局唯一,单元测试会变得困难,尤其是当涉及到复杂的业务逻辑时;添加新功能时,需要修改现有代码的单例实现,不符合开闭原则等
  • 单例模式实现由两种方式:饿汉式单例模式和懒汉式单例模式
  • 两种方式的实例化时机不同,饿汉式单例在程序启动时(或在任何静态初始化发生时)就创建了实例,而懒汉式单例则延迟到实际需要时才创建实例
    在这里插入图片描述

C++ 实现

饿汉式单例模式

  • 在main函数之前或动态库加载之前就完成了单例的创建,使用时不需要再创建对象,因此是线程安全的
  • 缺点:在程序启动时就已经存在,因此它可能在某些情况下导致不必要的资源使用,特别是创建成本较高且程序在大部分运行时间内都不需要它时。在这些情况下,懒汉式单例模式可能是一个更好的选择
#include <iostream>
class Singleton
{
   
public:
	static Singleton& getInstance() {
    return instance; }
	void PrintLog() {
    std::cout << "CHungryMode " << std::endl; };
public:
	// 禁止拷贝、移动和赋值
	Singleton(const  Singleton& mode) = delete;
	Singleton(Singleton&& mode) = delete;
	Singleton& operator=(const  Singleton& mode) = delete;
private:
	Singleton() {
   };
	~Singleton() {
   };
private:
	static  Singleton instance;          //静态成员变量
};
Singleton  Singleton::instance;  // 定义静态成员变量(通常放在源文件中,而不是头文件中)

int main()
{
   
	Singleton::getInstance().PrintLog();
    system("pause");
}

懒汉式单例模式

  • 在C++11标准后的版本,可以直接使用静态局部变量、call_once 实现懒汉式单例模式
  • 在C++11标准前的版本或者使用指针的方式实现单例模式时,需要考虑多线程问题

使用静态局部变量实现懒汉式单例模式(推荐)

  • C++11及以后续标准,使用static局部变量来实现单例模式的懒汉式是一种线程安全且高效的方法
  • 利用了C++11中局部静态变量初始化的线程安全性保证,无需额外的同步机制。当局部静态变量第一次被访问时,它会在一个线程安全的上下文中被初始化,并且只会被初始化一次
  • 但使用C++11之前版本或者使用指针的方式实现单例模式时,需要考虑多线程问题 [静态变量]
#include <iostream>
class Singleton
{
   
public:
	static Singleton

http://www.niftyadmin.cn/n/5796998.html

相关文章

xenomai环境下开源实时数控系统LinuxCNC EtherCAT编译安装

LinuxCNC是一款基于Linux操作系统的开源实时数控系统&#xff0c;可将普通计算机转变为高效的CNC&#xff08;计算机数字控制&#xff09;机器&#xff0c;本文记录xenomai下linuxcnc的构建简单记录&#xff0c;xenomai下构建无特别之处&#xff0c;主要参考链接https://www.li…

【Spring】Spring框架之-AOP

目录 1. AOP的引入 2. AOP相关的概念 2.1 AOP概述 2.2 AOP的优势 2.3. AOP的底层原理--目前先不具体阐述&#xff0c;后面讲 3. Spring的AOP技术-配置文件方式 3.1 AOP相关的术语 3.2 基本准备工作 3.3 AOP配置文件方式的入门 3.4 切入点的表达式 3.5 AOP的通知类型 …

【CSS in Depth 2 精译_088】第五部分:添加动效概述 + 第 15 章:CSS 过渡特效概述 + 15.1:状态间的由此及彼

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼 ✔️15.2 定时函数 文章目录 第 5 部分 添加动效 Adding motion第 15 章 过渡 Transitions15.1 状态间的由此及彼 From here…

宝塔面板跨服务器数据同步教程:双机备份零停机

之前发布的教程不够完美&#xff0c;安全性也不够&#xff0c;所以优化了很多地方 ┌────────────────────────────────────────┐ │ 系统功能选项 │ ├─────────────────────────…

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…

架构师应如何考虑重构

目录 重构的目的、时机、难点 1.1重构的目的 1.2何时重构 1.2.1 添加新功能的时候对周边历史进行小型重构 1.2.2 cide review 时 1.2.3 有计划有目的的重构 1.2.5 何时不该重构 1.3、重构的难点 1.3.1 保证重构前后行为一致。 1.3.2 减少出现问题带来的影响 1.4 常见的重构…

SpringBoot3+Vue3开发在线考试系统

项目介绍 项目分为3种角色&#xff0c;分别为&#xff1a;超级管理员、老师、学生。超级管理员&#xff0c;负责系统的设置、角色的创建、菜单的管理、老师的管理等功能&#xff0c;也可以叫做系统管理员&#xff1b;老师角色&#xff0c;负责系统业务的管理&#xff0c;包括学…

安全算法基础(一)

安全算法是算法的分支之一&#xff0c;还的依靠大量的数学基础进行计算&#xff0c;本文参照兜哥的AI安全样本对抗&#xff0c;做一个简单的算法安全概括&#xff0c;从零学习。 最新的安全算法对于我们常规的攻击样本检测&#xff0c;效果是不理想的&#xff0c;为了探究其原…