对象创建型模式:单例设计模式

树莓派4B+红外传感器:手把手教你DIY一个能走黑线的智能小车(Python代码全解析) 本文详细介绍了如何使用树莓派4B和红外传感器DIY一个智能循迹小车,包括硬件配置、GPIO连接、Python代码实现及优化算法。通过动态PWM调速、状态机设计和赛道记忆算法,提升小车的循迹性能和稳定性。适合初学者和电子爱好者动手实践。 阅读详情

前言

本文章根据刘伟(Sunny) 的设计模式一书记录的笔记,感谢作者的知识分享。

定义

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

  • 单例模式有三个要点:
    • 一 是某个类只能有一个实例;
    • 二 是它必须自行创建这个实例;
    • 三 是它必须自行向整个系统提供这个实例。

实现

实现一

最简单的实现,存在线程安全的问题

public class TaskManage {
    /**
     * 私有的构造方法
     */
    private TaskManage(){}

    private static TaskManage install = null;
    /**
     * 自己创建实例,并提供给外界使用
     */
    public static TaskManage getInstall(){
        if(install==null){
            install = new TaskManage();
        }
        return install;
    }

    public void paint(){
        System.out.println("显示任务管理器");
    }
}
面临多线程的时候会出现构建多个实例对象的问题
实现二

基于多线程安全改造

饿汉式实现单例,缺点就是可能会浪费资源

public class EagerSingleton {
    /**
     * 类被加载的时候就进行单例创建
     */
    private static EagerSingleton install = new EagerSingleton();

    /**
     * 私有构造函数
     */
    private EagerSingleton(){

    }

    /**
     * 给外面提供单例对象
     */

    public static EagerSingleton getInstall(){
        return install;
    }

    public void paint(){
        System.out.println("饿汉单例模式");
    }
}

懒汉式实现单例(直接是双重检查锁定实现的懒汉式单例类)

public class LazySingleton {
//    private static LazySingleton install = null;

    //双重判断的时候添加关键字volatile
    private volatile static LazySingleton install = null;

    private LazySingleton(){

    }

    /**
     * 添加synchronized关键字,保证了多线程的同步
     * 但是由于synchronized修饰的是getInstall方法,所以性能比较低,所以可以进行修改
     * @return
     */
//    synchronized public static LazySingleton GetInstance(){
//        if(install==null){
//            install = new LazySingleton();
//        }
//        return install;
//    }

    /**
     * 只有在单例对象为null的时候,才会进行锁的判断
     * 但是当两个线程同时进入锁判断的时候,一个线程获得锁进行单例的实例化的结束之后,另外一个线程还是会继续实例化单例对象,所以需要添加二重判断
     * @return
     */
//    public static LazySingleton getInstall(){
//        if(install==null){
//            synchronized (LazySingleton.class){
//                install = new LazySingleton();
//            }
//        }
//        return install;
//    }


    /**
     * 添加二重判断之后,就算另外一个线程继续实例化,但是之后会进行install判断才决定是否创建
     * 这时候需要在install前面加上volatile关键字,保证多线程操作的正确性
     * 尽管如此,加锁之后性能还是有影响的
     * @return
     */
    public static LazySingleton getInstall(){
        if(install==null){
            synchronized (LazySingleton.class){
                if(install==null){
                    install = new LazySingleton();
                }
            }
        }
        return install;
    }
}
实现三

综合懒汉饿汉的优缺点的ioDH实现单例,将线程安全交托给JVM负责

public class Singleton {

    private Singleton(){}

    static class  IohdSingleton{
        public static Singleton install = new Singleton();
    }

    public static Singleton getInstall(){
        return IohdSingleton.install;
    }

}

总结

  • 1.主要优点
    单例模式的主要优点如下:

    • (1) 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
    • (2) 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
    • (3) 允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。
  • 2.主要缺点
    单例模式的主要缺点如下:

    • (1) 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
    • (2) 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
    • (3) 现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失。
  • 3.适用场景
    在以下情况下可以考虑使用单例模式:

    • (1) 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
    • (2) 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
      思考
OpenHarness代码解读 Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。 阅读详情

相关推荐

STM32CubeIDE离线安装芯片PACK包全攻略(附离线包下载与导入步骤)

本文详细介绍了在STM32CubeIDE中离线安装芯片PACK包的完整流程,包括官方和第三方资源获取方法、本地安装步骤及常见问题解决方案。特别针对网络隔离环境下的嵌入式开发需求,提供了实用的版本管理和自动化部署技巧,帮助开发者高效完成芯片固件支持包的离线配置。

weixin_30825581的博客 300

设计模式——单例模式(高性能创建单个对象方法)

设计模式——之单例模式(高性能创建对象方法) 首先介绍一下设计模式: 1、设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结;(设计模式可以说是一套开发经验,开发前应该想好自己代码采用哪些设计模式,为后期维护、开发做准备) 2、设计模式的六大原则: ①单一职责原则:一个函数尽量执行一个功能;(更好维护,更不容易出错) ②里氏代换原则:构造函数中可以定义一些方法,但是不实现具体的...

cnailili的博客 452

从静态到动态:如何用Deformable 3DGS和4DGS实现高效动态场景建模

本文深入探讨了Deformable 3DGS和4DGS在动态场景建模中的技术突破,详细解析了这两种方法如何高效处理动态内容。Deformable 3DGS通过引入时间维度的变形场扩展传统3DGS,而4DGS则采用四维时空体素分解方法,两者均显著提升了动态场景建模的效率和质量,适用于虚拟现实、增强现实等应用场景。

weixin_29063035的博客 433

不可变对象设计模式

线程安全主要目的是在受控的并发访问中防止数据发生变化。除了使用synchronized关键字同步对资源的写操作之外,还可以在线程之间不共享资源状态,甚至将资源的状态设置为不可变。 java.lang.String的每一个方法都没有同步修饰,但是在多线程访问的情况下是线程安全的,Java8中通过Stream修饰的ArrayList在函数式方法并行访问的情况下也是线程安全的。 所谓“不可变对象”是...

LuuvyJune的博客 353

HDFView安装及使用教程

简介:直接用记事本打开hdf5文件的话,是一团乱码。HDFView是用来查看hdf5文件的软件,可以免费使用,好多人都有闪退的情况,这是因为没有添加环境变量。

qq_43722079的博客 7万+

Windows下TensorRT+YOLOv11部署避坑指南:从CUDA配置到模型加密全流程

本文详细解析了在Windows平台部署YOLOv11与TensorRT的全流程,重点涵盖从CUDA环境配置、工程编译适配到模型加密保护的实战指南。基于wang-xinyu的tensorrtx仓库,提供了详细的版本选择、编译问题修复方案,并深入探讨了如何对TensorRT引擎进行加密,以实现高效且安全的端到端部署。

vscode5coder的博客 450

利用单例模式创建指定的对象

import java.util.HashMap;import java.util.Map;/** * 利用单例模式返回指定的多个对象  *  * */public class Singleton4 { //定义在缓存中的key值 private static final String DEFAULT_KEY="param"; //定义初始变量 private static int num=1; ...

yichan_xiaoxiong的博客 688

CAN XL和10Base-T1S全对比:在区域架构中如何选择最适合的车载通信协议?

本文深入对比了CAN XL和10Base-T1S在车载网络架构中的性能差异,通过实测数据和典型应用场景分析,为区域架构设计提供选型指南。重点探讨了带宽、延迟、成本等关键指标,帮助工程师在ADAS传感器部署和车身控制网络优化中做出明智选择。

pear55的博客 595

四、设计模式之单例模式(重要)(创建型)

四、单例模式(创建型) 单例模式概述 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的一个实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。 其实,GoF对单例模式的定义是:保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。 为什么要用单例模式 这是因为在应用系统开发时,我们常常有以下需求: 在多个线程之间,比如servlet环境,共享同...

William 243

HSPICE用户必看:用Sigrity Broadband SPICE解决复杂封装建模的3个技巧

本文为HSPICE用户分享了三个使用Sigrity Broadband SPICE解决复杂封装建模难题的实战技巧。通过将宽频带S参数高效转换为时域SPICE模型,能显著提升仿真速度、保障收敛性,并精准分析谐振、返回路径不连续及超多端口PDN等关键问题,助力实现高效稳定的系统级信号与电源完整性分析。

metal的博客 600

对偶分解算法详解及其Python实现

对偶分解算法是一种广泛应用于求解凸优化问题的有效方法,尤其在大规模数据处理和分布式计算中展现出强大的实用性。在许多实际应用中,直接求解原始问题可能由于计算复杂度过高、资源受限或问题规模过大而变得不可行。这时,对偶分解方法为我们提供了一种高效的替代方案。对偶分解算法的核心思想是将复杂的原问题转化为其对应的拉格朗日对偶问题。通过引入拉格朗日乘子并构造对偶函数,该方法在一定程度上简化了问题的求解过程。特别是,对于包含多个约束条件的大规模优化问题,对偶分解可以将原问题分解为若干个小规模、相互独立的子问题。

闲人编程的博客 1752

【c++ 11新特性】设计模式

后续对同一个 std::once_flag 对象调用 std::call_once 时,会直接跳过执行逻辑。std::once_flag 对象会在第一次调用 std::call_once 时被标记为“已执行”。c、延迟加载:实例可以在需要时才被创建(懒汉式),也可以在类加载时就创建(饿汉式)。2、高效:std::call_once 内部优化了线程同步逻辑,性能优于手动加锁。上述代码中:std::once_flag 和 std::call_once的作用。b、全局访问:提供一个全局访问点来获取该实例。

weixin_44836378的博客 426

二十八.国民技术MCU开发之UID获取与应用

在国民NT MCU中均有一个96位和128位的唯一设备标识符,其中UCID128 位, UID 为 96 位。手册中描述的作用是:通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(SecureBootloader)。UCID 和 UID,遵守国民技术芯片序列号定义,它包含芯片生产及版本相关信息。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1677

创建型模式-单例设计模式

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。枚举类实现单例模式是极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。instance对象是随着类的加载而创建的。

m0_51607909的博客 2271

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

本文详细介绍了单例设计模式,包括其定义、结构、实现方法及适用场景。单例模式是一种创建型设计模式,确保一个类只有一个实例并提供全局访问点。其要点包括唯一性、私有构造函数、全局访问点和线程安全。文章还展示了单例设计模式的类图和时序图,并介绍了三种实现方式:饿汉式、静态内部类和枚举方式。最后列举了单例模式适合和不适合的场景,以及实战建议和示例,如配置中心、统一 ID 生成器、日志收集器等。

庄小焱 1492

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【设计模式】-单例设计模式(创建者模式)

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为:单例模式工厂方法模式抽象工程模式原型模式建造者模式1.1 单例设计模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的...

cnzzs的博客 1096

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 实现单例设计模式—创建型

简介 单例设计模式(Singleton Design Pattern)解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 实现单例一般要考虑的条件: 1,构造函数用private 修饰,访问权限的,避免外部通过 new 创建实例(对象); 2,考虑对象创建时的线程安全问题; 3,考虑是否支持延迟加载; 4,考虑 getInstance() 性能是否高(是否加锁)。 实现方式 实现单例方式:饿汉式,懒汉式,双重检测,静态内部.

ezconn的博客 711

【Java】设计模式——单例设计模式

单例设计模式介绍

啊松同学的博客 1220

java单例设计模式

单例设计模式

专栏 2790

从零开始学习Java设计模式 | 创建型模式篇:单例设计模式

从本讲开始,咱们就要开始正式学习23种设计模式了。当然,我们得按照顺序来学,首先先来学习23种设计模式里面的第一类模式,即创建型模式。 创建型模式的主要关注点是"怎样创建对象?",它的主要特点是"将对象的创建与使用分离"。也就是说,如果我们作为一个使用者的话,那么我们可以直接通过某种方式去获取别人创建好的对象,至于别人是如何创建的,我们并不关注。这样,就可以降低系统的耦合度了,使用者并不需要关注对象的创建细节,尤其是那些创建特别麻烦的对象。于是,创建型模式的好处就这样体现出来了。 此外,我们还应知道,创建型

李阿昀的博客 2252

创建型设计模式——单例模式

创建型设计模式,就是通过控制对象的创建方式来解决设计问题。

weixin_44050362的博客 789

创建型模式

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为: * 单例模式 * 工厂方法模式 * 抽象工程模式 * 原型模式 * 建造者模式

m0_62943934的博客 1075

设计模式详解——创建型

设计模式摘要:创建型模式 创建型设计模式包含5种核心模式,重点介绍单例、工厂和抽象工厂模式。单例模式确保全局唯一实例,通过私有构造、静态变量和访问点实现,分为饿汉式(类加载时创建)和懒汉式(首次调用创建)。工厂方法模式将对象创建延迟到子类,通过抽象工厂接口实现解耦和扩展性。抽象工厂模式则提供创建相关产品族的接口,适用于多平台UI、数据库适配等场景。这些模式共同解决了对象创建过程中的资源管理、解耦和灵活性等问题,是构建可维护系统的关键设计方法。

2303_82176667的博客 994

设计模式——创建型模式

创建型模式是软件工程中常用的设计模式之一,主要关注对象的创建过程。创建型模式隐藏了对象创建的细节,而不是直接使用new操作符创建对象。

2301_79654063的博客 1403

【设计模式】创建型模式之单例设计模式

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

Decade_Faiz的博客 652

创建型设计模式-1.单例设计模式

当涉及到需要确保一个类只有一个实例的情况时,单例设计模式是一个非常有用的设计模式。该模式通过私有化构造函数和静态方法来实现,以确保只能创建一个实例并提供全局访问点。单例模式在许多应用场景中都非常有用,比如线程池、缓存管理、日志记录器等。本文将介绍单例设计模式的基本原理和实现步骤,并提供一些实例来说明其实际应用。无论您是初学者还是有经验的开发人员,本文都将帮助您理解单例设计模式的概念和用法,以便在自己的项目中合理地应用该模式。

不知道你是通过何种途径访问到这里,总之欢迎来到red velet的博客 487
上一篇: 对象创建型设计模式:抽象工厂模式
下一篇: 对象创建型模式:原型模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值