类图+案例+代码详解:软件设计模式----单例模式

设计模式概述、UML图、类图、软件设计原则、创建型模式-单例模式 用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。上面代码可以看到已经组装了一台电脑,但是似乎组装的电脑的cpu只能是Intel的,内存条只能是金士顿的,硬盘只能是希捷的,这对用户肯定是不友好的,用户有了机箱肯定是想按照自己的喜好,选择自己喜欢的配件。 阅读详情

6、单例模式

指确保一个类仅有一个唯一的实例,并提供一个全局访问点。

所以把构造方法进行私有化,声明为 private 类型;同时提供一个获得实例的方法 getInstance() ,为public类型,并且是static,用于返回该类的实例。

请添加图片描述
核心思想:全世界只能有一个我 —— 保证类永远只有一个对象

比如:

  • 银行的 ATM 机系统,只能有一个 “总控中心” 管理所有机器
  • 电脑的 “任务管理器”,无论点多少次打开,永远只弹出同一个窗口
  • 单例模式就是让类具备 “全球唯一” 的特性

用生活案例拆解核心逻辑:
为什么需要单例?
避免资源浪费:比如打印机驱动只需要加载一次
保证数据统一:比如全局配置类只能有一个实例存储参数

如何实现 “唯一”?
第一步:把构造方法设为private(不让别人随便 new)
第二步:自己在类里创建唯一的实例
第三步:提供一个公共方法让别人获取这个实例

代码示例

public class President {
    // 静态单例实例,类加载时初始化,保证唯一
    private static President instance; 
    private String name;

    // 私有构造方法,防止外部直接实例化
    private President(String name) { 
        this.name = name;
    }

    // 静态工厂方法,提供获取单例实例的途径
    public static President getInstance(String name) { 
        // 检查实例是否未创建,且传入的名称不为 null
        if (instance == null && name != null) { 
            // 创建单例实例,传入名称参数
            instance = new President(name); 
        }
        // 返回单例实例,若未满足创建条件,可能返回 null
        return instance; 
    }

}

多线程下的单例模式

给 “唯一实例” 加把 “线程安全” 的锁

为什么多线程需要特殊的单例?
想象两个用户同时抢最后 1 张演唱会门票,如果单例模式没考虑多线程,可能出现:
1.用户 A 检查到 “剩余票数 = 1”,准备购买
2.用户 B 同时检查到 “剩余票数 = 1”,也准备购买
3.最终两人都买到票,但实际库存只扣了 1 张 —— 这就是线程安全问题

3 种多线程单例实现:从简单到高效

1. 最直接的方案:synchronized 锁整个方法
使用同步机制,将 getInstance() 方法声明为static synchronized类型的。限定了每个执行该方法的线程必须彻底执行完以后,才能允许第二个线程执行该方法,从而确保了所创建对象的唯一性。

public class SynchronizedSingleton {
    private static SynchronizedSingleton instance;
    
    private SynchronizedSingleton() {}
    
    // 给获取实例的方法加锁,保证同一时间只有一个线程能进入
    public static synchronized SynchronizedSingleton getInstance() {
        if (instance == null) {
            instance = new SynchronizedSingleton();
        }
        return instance;
    }
}

缺点:锁范围太大,每次调用getInstance()都要排队,效率低

2. 优化版:双重检查锁定(DCL)

public class DoubleCheckSingleton {
    private static volatile DoubleCheckSingleton instance;  // 关键:volatile防止指令重排
    
    private DoubleCheckSingleton() {}
    
    public static DoubleCheckSingleton getInstance() {
        // 第一次检查:实例存在则直接返回,避免无意义加锁
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) {  // 锁类对象,范围更小
                // 第二次检查:可能有多个线程同时通过第一次检查,需再次确认
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                    // 这里可能发生"指令重排",volatile禁止重排
                }
            }
        }
        return instance;
    }
}

核心技巧:

  • 双重检查:先判断是否为空,避免每次都加锁
  • volatile 关键字:防止 JVM 优化时指令重排,避免返回未初始化的实例

为什么 DCL 需要 volatile?一个危险的例子:

假设没有volatile,JVM 可能对instance = new DoubleCheckSingleton();做如下优化:

  1. 分配内存空间
  2. 先赋值引用(instance 指向未初始化的对象)
  3. 执行构造方法初始化对象

如果线程 A 执行到步骤 2 时,线程 B 刚好调用getInstance():

  • 线程 B 发现instance != null,直接返回未初始化的对象
  • 此时访问instance会导致空指针异常或数据错误

3. 终极方案:静态内部类(推荐)

public class InnerClassSingleton {
    private InnerClassSingleton() {}
    
    // 静态内部类只有在被调用时才会加载,天然线程安全
    private static class SingletonHolder {
        private static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
    }
    
    // 调用时才会触发SingletonHolder的加载,实现延迟初始化
    public static InnerClassSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

原理:

  • Java 类加载机制保证:静态内部类的初始化是线程安全的
  • 只有当getInstance()被调用时,SingletonHolder才会加载并创建实例
Python中的单例模式:深入探索元类与装饰器实现 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一种动态语言,其灵活性使得实现单例模式的方式有多种,本文将深入介绍几种常见的单例模式实现方式,包括基于装饰器、元类和模块级别单例的实现。通过大量代码实例,结合中文注释,我们将逐步解析这些方法的优缺点,并展示如何在实际开发中应用单例模式来优化代码结构和提高性能。尤其会重点讲解元类与装饰器的实现机制,帮助读者掌握这两种强大工具的用法。通过这些内容,读者能够更好地理 阅读详情

相关推荐

单例模式:一文把单例模式使用讲清楚

单例模式

胡说八道,欢迎来此交流霸道心得 702

Python 单例模式 详解

文章主要整理了Python面向对象中:单例模式和单例模式如何实现的相关内容!

storyfull 1万+

软件设计师:单例模式、建造者模式、原型模式

软件设计师设计模式:单例模式;建造者模式;原型模式

天涯雨的博客 969

C# 单例模式详解

定义单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,避免频繁创建对象,节约内存。单例模式的应用场景很多,比如我们电脑的操作系统的回...

zls365365的博客 1万+

PCRNet: Point Cloud Registration Network using PointNet Encoding

PCRNet算是在ModelNet40这种object-centric数据集上用deep-learning做配准最好入手的一篇文章了,整体架构涉及简洁明了,一句话描述就是简单粗暴,话不多说,直接上网络架构图: Work Flow: 首先对输入source (N×3N \times 3N×3)与template (M×3M \times 3M×3)进行PointNet操作,即MLP + max-pooling后,分别得到描述各自点云的维度为1024的global feature vector:Φ(PS).

dloading7的博客 1647

使用下一代的嵌入式IDE-PlatformIO 教程

1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy

jiladahe1997的博客 3万+

软件设计模式:单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。以上就是软件设计模式的单例模式的讲解。

浩泽学编程的博客 1570

用5毫欧采样电阻实现高精度电流检测?数字可调电源控制板的硬件设计陷阱

本文深入探讨了在数字可调电源控制板设计中,如何利用5毫欧采样电阻实现高精度电流检测。从微小信号放大电路设计、采样电阻布局与热管理,到电源切换与电池管理电路优化,提供了全面的硬件设计解决方案和实用技巧,帮助工程师规避常见设计陷阱,提升系统性能。

wdx0123456的博客 1029

Java设计模式超详解(一:设计模式概述、UML图、软件设计原则、创建者模式)

本文介绍了软件设计模式的概念、分类和应用,强调其在提高软件开发效率、代码复用性和可维护性方面的重要性。文章首先从设计模式的起源开始,讲述了其从建筑领域转向软件工程的过程,并提到经典的《设计模式:可复用面向对象软件的基础》一书及其23种设计模式。接着,文章详细讲解了设计模式的三大类别:创建型模式、结构型模式和行为型模式,并逐一阐述了UML图在设计中的作用,尤其是类图的表示方式及类之间的各种关系(如继承、聚合、依赖等)。随后,文章深入探讨了软件开发中的六大设计原则,包括开闭原则、里氏代换原则、依赖倒转原则等

LLM | Agent | RAG | Java 3027

手把手教你用Kali Linux搭建vulntarget-a靶场环境(附详细配置步骤)

本文详细介绍了如何在Kali Linux环境下搭建vulntarget漏洞靶场,包括环境规划、虚拟化平台配置、靶机系统部署及安全工具链配置等关键步骤。通过实战演练,帮助网络安全从业者和初学者掌握专业级漏洞实验平台的搭建与管理技巧,提升安全测试能力。

weixin_29279101的博客 107

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 393

【软件设计模式之单例模式】

单例模式是一种确保一个类只有一个实例,并提供一个全局访问点来访问这个实例的设计模式。它属于创建型模式,着重于如何有效地创建对象。唯一实例:确保只创建类的一个实例。全局访问:提供一个全局访问点,全局任何地方都可以访问这个实例。自管理实例创建:类本身负责创建和管理自己的唯一实例。这种模式通常通过将类的构造函数设计为私有,以防止外部通过new操作符创建多个实例,同时提供一个公共的静态方法来获取这个唯一实例。

武帝为此的博客 1631

深入解析Xilinx IDELAYE2在FPGA时序优化中的关键作用与实战配置

本文深入解析了Xilinx FPGA中IDELAYE2模块在时序优化中的关键作用。作为精密的信号延时微调器,IDELAYE2通过可编程的抽头延迟,有效解决高速接口中数据与时钟的相位偏差问题。文章详细阐述了其必须与IDELAYCTRL配对使用的核心机制,并对比分析了FIXED、VARIABLE和VAR_LOAD三种工作模式的实战配置方法与代码示例,为FPGA工程师提供了解决时序收敛难题的关键硬件配置指南。

pear55的博客 1184

单例模式详解

概述单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例。单例应用场景Windows系统的任务管理器。Windows系统的回收站。操作系统的文件系统,一个操作系统只能有一个文件系统。数据库连接池的设计与实现。多线程的线程池设计与实现。Spring中创建的Bean实例默认都是单例。Java-Web中,一个Ser...

程序员囧辉 5526

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的

MengYa_Dream的博客 4716

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

单例模式 UML类图的实现

1.单例模式 2.UML图的绘制 3.UML的实现 1.单例模式 1.1 解决问题:一个类永远都只能创建出一个对象 (1)地球:唯一对象 (2)池:连接池,线程池 单例:单个实例-单个对象 singleton 1.2 a.类:依然是类 b.属性:其它的属性 当前类的静态属性-private (a):懒汉模式 :没有初始化 (b):饿汉模式:初始化 c.构造方法-private:阻止了用户随意n...

qq_45212924的博客 4180

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

单例模式(Singleton Pattern)详解:确保类的唯一性

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例。确保类只有一个实例。提供一个全局访问点,允许任何地方访问该唯一实例。

qq_35803412的博客 1524

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

软件设计模式-单例模式

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。

gwq0826的博客 678

python单例模式详解

单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建...

前路艰险,路途漫长 5239

软件设计模式—单例模式

单例模式 就是只需要一个即可,比如单位的公章 记得之前英语学the的用法(用来特指唯一的存在的事物) the sun、the moon

Ng-Yuih的博客 624

软件设计模式——单例模式

单例模式

wangshiqi666的博客 1761

设计模式学习笔记(类图+代码实现)

但是对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,且父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。双向关联就是双方互相依赖,可以细分为一对一、一对多、多对一和多对多,例如学生和课程,学生选课,课程被学生学习,这是一个多对多的关系,一个学生可以选取多门课程,一个课程可以被多个学生选取,例如丈夫和妻子,就是一对一关系,自关联是一种特殊的单向关联,例如链表的Node节点的指针域就是Node类型的。

69岁法外狂徒的博客 1982

软件设计模式之单例模式

单例模式是一种确保类仅有一个实例并提供全局访问点的设计模式。主要有饿汉式(类加载时创建)、懒汉式(首次使用时创建)、双重检查锁(线程安全)等实现方式。优点包括资源管理高效、全局访问便利、线程安全等;缺点则是灵活性不足、测试复杂、扩展性受限等。适用于数据库连接管理、配置统一管理、稀缺资源管控等需要全局唯一实例的场景。各种实现方式需根据具体需求在性能、线程安全等方面进行权衡选择。

0xFFFFFFFF 951

软件设计模式——单例模式详解

详细介绍了软件设计模式中的单例模式,包括单例模式的各种实现方式,如何破坏单例模式等。

zxy5663的博客 1074
上一篇: 类图+案例+代码详解:软件设计模式----原型模式
下一篇: 类图+案例+代码详解:软件设计模式----适配器模式
N_NAN_N
博客等级 码龄3年 195粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值