GOF23设计模式之 单例模式

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南) 本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。 阅读详情

单例设计模式

核心作用

  • 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

常见应用场景:

  • windows的任务管理器
  • 网站的计数器
  • Spring中,每个Bean默认就是单例的
  • 等等

单例模式的优点:

  • 由于单例设计模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他以来对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
  • 单例模式可以在系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

常见的五种单例模式实现方式:

  • 主要:
    • 懒汉式(线程安全,调用效率高。但是,不能延时加载。)
    • 饿汉式(线程安全,调用效率不高。但是,可以延时加载。)
  • 其他:
    • 双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题。不建议使用)
    • 静态内部类式(线程安全,调用效率高,但是,可以延时加载)
    • 枚举单例(线程安全,调用效率高,不能延时加载)

饿汉式实现(单例对象立即加载)

public class SingletonDemo02{
        private static /*final*/ SingletonDemo02 s = new SingletonDemo02();
        private SingletonDemo02(){} //私有化构造器
        public static /*synchronized*/ DingletonDemo02 getInstance(){
            return s;
        }
    }


public class Client{
    public static void main(String[] args){
        SingletonDemo02 s = SingletonDemo02.getInstance();
        SingletonDemo02 s2 = SingletonDemo02.getInstance();
        System.out.println(s==s2); //结果为true
    }
}
  • 饿汉式单例模式代码中,static变量会在类装载时初始化,此时也不会涉及多个线程对象访问该对象的问题。虚拟机保证只会装载一次该类,肯定不会发生并发访问问题。因此,可以省略synchronized 关键字
  • 问题:如果只是加载本类,而不是要调用getInstance(), 甚至永远没有调用,则会造成资源浪费!

懒汉式实现(单例对象延迟加载)

public class SingletonDemo02{
    private static SingletonDemo02 s;

    private SingletonDemo01(){} //私有化构造器

    public static synchronized SingletonDemo02 getInstance(){
        if(s==null){
            s = new SingletonDemo02();
        }
        return s;
    }
}
  • 要点:
    • lazy load! 延迟加载,懒加载! 真正用的时候才去加载!
  • 问题:
    • 资源利用率高了。但是,每次调用getInstance()方法都要同步,并发效率低。

双重检测锁实现

public class SingletonDemo03{
    private static SingeltonDemo03 instance = null;
    public static SingeltonDemo03 getInstance(){
        if(instance == null){
            SingletonDemo03 sc;
            synchronized(SingletonDemo03.class){
                sc = instance;
                if(sc == null){
                    synchronized(SingletonDemo03.class){
                        if(sc == null){
                            sc = new SingletonDemo03();
                        }
                    }
                    instance = sc;
                }
            }
        }
        reutrn instance;
    }
    private SingletonDemo03(){
    }
}
  • 这个模式将同步内容下发到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步创建了以后就没必要了。
  • 问题:
    • 由于编译器优化原因和JVM底层内部模型的原因,偶尔会出问题,不建议使用

静态内部类实现方式(也是一种懒加载方式)

public class SingletonDemo04{
    private static class SingletonClassInstance{
        private static final SingletonDemo04 instance = new SingletonDemo04();
    }
    public static SingletonDemo04 getInstance(){
        return SingletonClassInstance.instance;
    }
    private SingletonDemo04(){
    }
}
  • 要点:
    • 外部类没有static属性,则不会像饿汉式那样立即加载对象
    • 只有真正调用getInstance(), 才会加载静态内部类。加载类时是线程安全的。instance是static final类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性。
    • 兼备了并发高效性和延迟加载优势!

用枚举实现单例模式

public enum SingletonDemo05{
    /**
    * 定义一个枚举的元素,它就代表了Singleton的一个实例
    **/
    INSTANCE;
    /**
    * 单例可以有自己的操作
    **/
    public static void singletonOperation(){
        //功能处理
    }
}

public static void mian(String[] args){
    SingletonDemo05 sd = SingletonDemo05.INSTANCE;
    SingletonDemo05 sd2 = SingletonDemo05.INSTANCE;
    System.out.println(sd==sd2);
}
  • 优点:
    • 实现简单
    • 枚举本身就是单例模式。由JVM从根本上提供保障!避免通过反射和反序列化的漏洞!
    • 无延迟记载

如何选用?

  • 单例对象,占用资源少,不需要延时加载:
    • 枚举式 好于 饿汉式
  • 单例对象 占用资源大,需要延时加载
    • 静态内部类 好于 懒汉式

防止破解单例模式(不包含枚举实现)

  1. 通过反射破解单例模式
    • 可以在构造方法中手动抛出异常
  2. 通过反序列化破解单例模式
    • 可以通过定义readResolve()防止获得不同对象,(实际是一种回调),定义返回哪个对象。
宝骏kiwi 630 730 560 E100 E200 E300 310 510 610 330 530维修手册电路图资料线路图接线图更新 2020-2022年宝骏RS-3维修手册和电路图。2020-2022年宝骏RS-3维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2021年宝骏510维修手册和电路图。2019-2021年宝骏510维修手册和电路图。 阅读详情

相关推荐

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1720

【GoF23种设计模式】02_单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。

weixin_48627356的博客 1314

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64)

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64) MCU型号为STM32F103RCT6,OLED屏为中景园电子1.3寸屏,驱动芯片为sh1106,分辨率为128x64,MDK版本为V5.34。

Master_0_的博客 6270

GOF23设计模式之单例模式

GOF23设计模式(Group Of Four) 为国外很有名的四个大牛总结的23总常见的套路 分类: 1)创建型模式 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式 2)结构型模式 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 3)行为型模式 模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、...

weixin_30628801的博客 111

ICDAR数据集简介

ICDAR(文档分析与识别国际会议)是OCR领域的权威会议,每两年发布一次数据集,专注于‌自然场景文本检测与识别‌,涵盖多语言、复杂版式和真实环境挑战。街景、广告牌、票据、手写文档等真实场景图像。包含水平、垂直、倾斜、弯曲文本,背景干扰大,部分文本存在遮挡或模糊。提供文本位置坐标(矩形/四边形框)及内容,无法识别的文本标记为###。以上总结提炼了ICDAR的核心价值与应用方法论。给出最佳实践方法是官网数据预训练模型 + 业务数据微调(比如用PPOCRLabel标注100+张业务图)。

xinghaitao2005的博客 1117

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8506

GOF23种设计模式——单例模式

GOF23种设计模式——单例模式 前言 单例模式是23中设计模式中最简单的一种,只需要一个类就可以实现,是非常常用的设计模式之一。老司机开车,请扶好坐稳,前方到站-单例模式站。 单例模式的特点 1、单例类只能有一个实例; 2、单例类必须自己创建自己唯一的实例; 3、单例对象必须给其他所有对象提供这一实例; 单例模式的优点 1、...

qzw_wmh的博客 406

BMW Standard Tools 宝马FSC工具套装下载

这是一款非常专业的一套宝马编码工具,懂行的人自然知道他的用处,不懂行的人,我解释再多也不会明白的,需要的拿去吧。软件名:BMW Standard Tools包含工具:BMW Coding Tool v2.50、change Language、CIC Mafia、Dr.Gini B021、EasyConnect、EDIABAS Konfigurator v1.1、EDIABAS Konfigurator v2.0.0、FSC-Tools_2.18、FSTool_v2_CarServer、INPA、ITool

Zj_arrow的博客 6995

【GOF23设计模式】_单例模式JAVA226-228

一、S03E226_01【GOF23设计模式】_单例模式、应用场景、饿汉式、懒汉式二、S03E227_01【GOF23设计模式】_单例模式、双重检查锁式、静态内部类式、枚举式、UML类图三、S03E228_01【GOF23设计模式】_单例模式、反射和反序列化漏洞和解决方案、多线程环境测试、CountDownLatch同步类的使用

好好学习天天向上 899

【WPF】渲染失败甚至程序崩溃,D3DImage.Lock卡死,报COMException异常和UCEERR_RENDERTHREADFAILURE消息

最近遇到WPF程序抛出ystem.Runtime.InteropServices.COMException异常,异常消息UCEERR_RENDERTHREADFAILURE (Exception from HRESULT: 0x88980406),或者先在D3DImage.Lock卡死,然后再出异常的问题。 现象和复现方法 出现了标题中的现象,你很可能有至少两个屏幕,并且可能在你的程序中直接或间接用了如下的库或技术: 1、WpfD3D这个开源库 2、自行使用了WPF中的D3DImage类,实现D3D

几罗星人的专栏 8253

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1925

【GOF23设计模式】单例模式

【GOF23设计模式】单例模式 来源:http://www.bjsxt.com/一、【GOF23设计模式】_单例模式、应用场景、饿汉式、懒汉式 1、GOF23设计模式 2、单例模式 3、饿汉式 1 package com.test.singleton; 2 /** 3 * 测试饿汉式单例模式 4 *...

weixin_30652879的博客 125

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 153

GoF 23种经典的设计模式——单例模式

注意:自 C++11 起,静态局部变量在多线程环境下是线程安全的(C++11 标准要求编译器在初始化静态局部变量时提供线程安全的初始化保证。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。由于单例模式的特性,这两个指针应该是相等的,因为它们都指向相同的唯一实例。,用于保存唯一的实例。负责创建实例(如果尚未创建)并返回该实例的指针。

Aft3rGl0w的博客 1025

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java_226_GOF23设计模式_单例模式_应用场景_饿汉模式_懒汉模式_练习

设计模式GOF23 单例模式 package java_226_GOF23设计模式_单例模式_应用场景_饿汉模式_懒汉模式_练习; /** 测试恶汉式单例模式 */ public class SingletonDemo01 {//SingletonDemo单例演示 //2.提供静态属性;恶汉式:即类初始化时立即加载这个对象;不管后面使用不使用;这个加载线程本身就是安全的 private static SingletonDemo01 instance = new SingletonDemo01

weixin_45339692的博客 166

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java GoF 23种设计模式-创建型模式-单例模式(Singleton Pattern)

文章目录一、模式动机二、模式定义三、模式结构四、代码实现 一、模式动机 对于系统中的某些类来说,只有一个实例很重要,例如在计算机系统中,多线程中的线程池、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、ID(序号)生成器等常常被设计成单例。 在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在,这样的模式有几个好处: 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 有些类如ID(序号)

WU4566285的博客 339

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

GOF23种设计模式之单例模式

GoF: 《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)"。 常用的...

qq_44066201的博客 382

GOF23设计模式(创建型模式)单例模式

目录: 一:单例模式的核心作用、常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用:保证一个类只有一个实例对象,并且提供一个访问该实例对象的全局访问点(获取实例对象的方法),通过该访问点获得对象唯一 常见应用场景: 1 Windows的 Task Manager(任务管理器)就是很典型的单例模式(无论打开多少次任务管理器,只会出现一个任务管理器

欢迎来到 Baret-H 的博客 1522

226_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_单例模式_应用场景_饿汉式_懒汉式

GOF23:group of four 23-四人帮的23种模式 - 创建型模式   单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式 - 结构型模式   适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 - 行为型模式   模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式单例

jingjbuer的专栏 2452

GoF23设计模式(0)单例模式Singleton

“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”——《设计模式》(艾迪生维斯理, 1994)。

机器学习 789

GOF23设计模式之单例模式-Singleton

本文解决了哪些问题? 1. 单例的几种实现,有何异同? 2. 什么是序列化与反序列化?如何防止反序列化破坏单例? 3. 何为反射破坏单例?如何避免? 4. 如何优雅的实现单例模式? 5. 框架中如何运用单例模式的?

zhengyong14350的博客 816

GOF23 设计模式之单例模式

设计模式之单例模式什么是单例模式使用场景实现方式实现代码答疑解惑 什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。

lujiedebaba的博客 182

GOF23设计模式之单例模式详解

设计模式在软件设计开发中经常被使用到,是一个高级软件工程师开发项目必备的技能之一,设计模式总共有23种,本篇文章,笔者将介绍第一种设计模式:单例模式的使用。 本篇文章主要围绕下面三个方面来讲解单例模式: 单例模式的五种方式的使用 如何使用反射以及反序列化破解单例模式并且防止破解 五种单例模式创建方式性能的比较 在谈上面几个问题之前,先来看看什么是单例模式以及它的应用场景。 ...

不清不慎的博客 762

GOF23 设计模式 之单例模式

单例模式 : 保证全局只有一个类只有一个实例,并且提供一个访问该实例的访问点; 例子: windows的回收站,任务管理器,文件系统, 应用程序的日志应用, 数据连接池的设计, spring的控制器,Bean Application也是典型的单例应用 ******************************** 分类: 1,饿汉式 天然线程安全 不能懒加载 效率高 但是浪...

wangrong111222的博客 185

GOF23种设计模式面试之单例模式

单例模式的8种写法 饿汉式:很急迫,在类加载的时候就初始化完毕了 饿汉式(静态常量)【可用】 饿汉式(静态代码块)【可用】 懒汉式:lazy-load,只有在调用的时候才初始化 懒汉式(线程不安全)【不可用】 懒汉式(线程安全)【不推荐】 效率低 懒汉式(同步代码块,线程不安全)【不可用】 双重检查【推荐】 静态内部类【可用】 枚举【推荐】 ...

u014792301的博客 285

设计模式GOF23之单例模式

单例模式的五种方式 主要:懒汉式,饿汉式 其他:双重检测锁(Double Checking模式),静态内部类,枚举模式 选取时机 延时加载,占用内部资源大:静态内部类好于懒汉 不延时加载,占用内部资源小:枚举好于饿汉 /*** 单例模式 懒汉式* @author 小帆敲代码**/public class D...

qq_44711190的博客 185
上一篇: Java 内部类
下一篇: GOF23设计模式之 工厂模式
coderbean
博客等级 码龄11年 12粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值