Java设计模式之单例模式

java设计模式之单例模式——Singleton pattern 设计模式故事会:https://blog.youkuaiyun.com/weixin_40205234/article/details/90664824 单例模式 单例模式(Singleton pattern)是java中最常见的设计模式之一。该模式属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一... 阅读详情

        单例模式是一中很重要的设计模式,各种框架运用都非常的多。我个人觉得,单例模式可以非常简单,也可以比较复杂,看你怎么实现。单例模式常见的写法分为两种写法,分别是饿汉式和懒汉式,这我相信大家都是比较了解的,这两天学习的时候,听到了第三种写法,使用静态内部类来实现。下面我们就来通过代码来分别实现一下

1. 单例模式之饿汉式

        其实我个人觉得饿汉式是单例模式中性价比最高的一种写法了,我有主要是从这几方面来考虑的。首先单例模式的饿汉式写法简单,别人很容易理解,其次饿汉式写法还可以在不加锁的情况下避免多线程环境下的并发问题,当然也不是没有缺点,可能最让人可以想到的缺点就是占用内存资源了。饿汉式写法如下

public class Singleton {

    private Singleton() {}

    private final static Singleton SINGLETON = new Singleton();

    public static Singleton getInstance() {
        return SINGLETON;
    }
}

这种写法其实还是很好理解的,就不再过多的说明了,接下来介绍懒汉式写法

2. 单例模式之懒汉式

        单例模式的懒汉式写法最多,网上也特别多这方面的技术博客,我也看了挺多的,各种的演化版本,一个版本比一个版本完善,我这里就提供两个版本吧,一个是原始版本,一个是最完美的版本,原始版本对应的源码如下

public class SingletonA {
    
    private SingletonA() {}

    private static SingletonA SINGLETON;
    
    public static SingletonA getInstance() {
        if (SINGLETON == null) {
            SINGLETON = new SingletonA();
        }
        return SINGLETON;
    }
}

号称最完美的懒汉式写法如下

public class SingletonA {

    private SingletonA() {}
    //volatile关键字可以保证线程之间的可见性,当某个线程创建对象后,变量SINGLETON变化后,其他线程可以知道变化
    private static volatile SingletonA SINGLETON;

    public static SingletonA getInstance() {
        if (SINGLETON == null) {
            synchronized (SingletonA.class) {
                if (SINGLETON == null)
                    SINGLETON = new SingletonA();
            }
        }
        return SINGLETON;
    }
}

以上两种是比较常见的两种单例模式的写法,另外第三中写法是通过内部类来实现,这种实现也是一种不需要加锁的实现方式,效率上比饿汉式更加高效

3. 单例模式之内部类

        内部类的实现是通过Java的类加载特点来实现的一个特殊写法,实现方式如下

public class SingletonB {

    private SingletonB() {}

    private static class Holder {
        private static final SingletonB SINGLETON = new SingletonB();
    }

    public static SingletonB getInstance() {
        return Holder.SINGLETON;
    }
}

这个就需要我们验证一下类和内部类的加载方式了,我们通过一个代码来验证

public class TestStaticClass {

    static {
        System.out.println("加载外部类。。。");
    }

    public static class InnerClass {
        static {
            System.out.println("加载内部类。。。");
        }
        public static void testMethod() {
            System.out.println("执行内部类方法。。。");
        }
    }
}

测试结果如下

可以得出结论:加载一个类时,其内部类不会同时被加载。一个类被加载的时机在其某个静态成员(静态域、构造器、静态方法等)被调用时才会被加载。

        所以根据这个特性,当单例类被加载时,单例类的内部类是不会加载的,只有当单例类的静态成员(静态域,构造器,静态方法)被调用时才会被加载。所以源码中SingletonB加载时,其内部类Holder并不会被加载,只有当调用了getInstance方法时,方法中调用了Holder的静态成员变量SINGLETON后,Holder被加载并执行创建对象的操作,而类加载只会加载一次,所以这种也可以实现单例,并且在未加锁的情况下。

以上是我对单例模式各个版本写法的一些理解总结,欢迎讨论。。。

【Java设计模式】Java设计模式之(一)单例模式(Singleton Pattern) 本文继续介绍23种设计模式详解系列之单例模式。 一、单例模式的定义 指一个类只有一个实例,且该类能自行创建这个实例的一种模式。 二、单例模式的常见例子 Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误;在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中 阅读详情

相关推荐

告别‘打架’的检测头:手把手教你用PyTorch实现YOLOv11解耦头(附完整代码)

本文详细解析了YOLOv11解耦检测头的创新设计与PyTorch实现,通过解耦分类和回归任务,显著提升目标检测性能。文章包含完整的代码实现、架构设计解析及工程调优技巧,帮助开发者深入理解并应用这一先进技术。

weixin_29031057的博客 301

手写常见23设计模式

【1】Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.设计模式。如果你要开发一个框架,系统,那一定要考虑设计模式,使你的框架有松散的结构、好的扩展性、低的耦合性以及较好的易用性。常见业务开发可适当考虑设计模式,从而使自己开发的业务有一定的扩展性;手写了常见23种设计模式存在github仓库,以供指正、参考、借鉴。设计模式,应该从场景和业务出发,做出合理的选择。脚本之流无需考虑设计模式,多为一次性使用;

海若_matrix的博客 485

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

本片文章全文12000字,细致讲述从申请账户到小程序注册到打印机的选型最后到实现微信小程序云开发订单支付更新与小票,标签打印完整的高效流程。客户A在我们的点餐平台上点了一杯咖啡,所以客户要在选好后付款,在付款完成后商家的小票打印机和标签打印机打印出本订单的相关信息。

weixin_52312427的博客 3649

精讲23种设计模式-001:纯手写Java动态代理模式

001:纯手写Java动态代理模式1 代理设计模式基本概念与应用场景2 实现静态代理两种方式3 静态代理与动态代理模式的区别4 基于JDK动态代理的使用5 为什么Jdk动态代理不能用子类接收6 JDK生成的代理类$Proxy源码分析7 手写JDK动态代理 1 代理设计模式基本概念与应用场景 课程内容 代理模式为何是程序员必备技能 静态代理与动态代理实现区别 Jdk动态代理为何需要InvocationHandler接口 CGLIB动态代理与Jdk动态代理区别 10分钟完全纯手写一个Jdk动态代理 代理设计

枫火的博客 839

德国冯哈勃 Faulhaber2342L012空心杯减速电机带编码器

为了制作平衡车,我在淘宝上面买了一个 Faulhaber2342L012空心杯减速电机电机,具体参数如下: 一:电机参数 型    号:德国冯哈勃Faulhaber带编码器空心杯减速电机2342L012  12V每分 钟 120转 工作电压: 12V 空载转速:8100RPM(转每分钟) 减速后速:120RPM(转每分钟) 直     径:30mm

u011511430的专栏 1万+

树莓派小车:智能捡球小车——Q宝

在遇到第一个直角右转口后,进入阶段二,阶段二是智能小车减速,因为速度过快可能导致车头下方的检测出现小毛病,小车进入第一个左拐路口,增加左转时间,然后直行,到横线处,小车停止,进入阶段三,小车先识别前方的球类,然后倒车到拐口处,原地右转,之后的识别也是类似的操作,随后有一个简单的避障功能,进行球类识别测试时,在本地测试效果良好,但是投入实际应用中时,受到光线等因素的影响,识别球类的能力大大下降。小车摄像头精度不够,视角较小,在识别人脸时,需要不断移动人脸照片,让摄像头能够抓取人脸。在第一阶段的循迹过程中,

dfbsszxzv的博客 1932

手写java设计模式_大话设计模式(自己手写java代码完成例子)

大话设计模式1.1面试受挫里面的样例,自己是个小菜,自学java中,写的代码有问题,请指导一下,让我更加进步,上代码。package btdp.one.one;import java.util.Scanner;/*** Big talk design pattern 1.1* desc: Simple calculator* @date 2018-08-14* @author szq**/publ...

weixin_30452659的博客 313

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

大话设计模式(自己手写java代码完成例子)

大话设计模式 1.3代码规范 package btdp.one.three; import java.util.Scanner; /** * Big talk design pattern 1.3 * desc: Simple calculator * @date 2018-08-14 * @author szq * */ public class Progra...

song286721596的博客 526

Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。

Bravo 2475

群辉NAS映射为本地盘符

鼠标右击网络→映射网络驱动器→以上适合通过局域网操作,采用ZeroTier组网后,也可以按照以上步骤实现,这时使用 “虚拟局域网”的IP地址。

dgnankai的专栏 5774

23种设计模式之创建模式....(java实现)

前言:最近找工作没有怎么更新博客了,找工作的过程中被问到很多关于设计模式的问题。有的叫我画类图,有的叫手写代码实现一下,最有意思的是面试有米科技时面试官问java api中那些用到了设计模式(本人表示很想进去)。经过这个问题之后令我深思了,我们学习了这么多设计模式到底有没想过该怎么用,那些设计java api的大牛在哪里用到了设计模式,于是重拾一下设计模式。写这篇的文章为了让自己温习一下设计模式,

q282048277的博客 1172

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

jks212454的博客 1063

彻底搞懂设计模式DesignPattern-单例模式-java.lang.Runtime看单例懒汉式

参考 炸斯特 - JAVA设计模式之单例模式 简介 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。 比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。 特点 java中单例模式是一种常见的设计模式,

Ping 365

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java设计模式之单例模式(Singleton pattern)

java设计模式之单例模式(Singleton pattern) 单例模式的定义: Singleton pattern restricts the instantiation of a class and ensures that only one instance of the class exists in the java virtual machine. The singlet

nobody 2249

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA设计模式——单例模式八种方式

目录 单例模式简介: 应用场景: 单例设计模式的八种方式: 1、饿汉式(静态常量) 2、饿汉式(静态代码块) 3、懒汉式(线程不安全) 4、懒汉式(线程安全,同步方法) 5、懒汉式(线程安全,同步代码块) 6、双重检查(推荐使用) 7、静态内部类(推荐使用) 8、枚举(推荐使用) 单例模式在JDK应用的源码分析 单例模式注意事项和细节说明 单例模式简介: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供

龍弟-idea的博客 7110

【Java设计模式】之 单例模式(Singleton Pattern)模式 饿汉式单例模式 vs 懒汉式单例模式

什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模免去我们自己再思考和摸索,设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,"套路”。 设计模式的分类: ① 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 ② 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ③ 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、

weixin_46081857的博客 418

Java 设计模式 - 单例模式

Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录Java 设计模式 - 单例模式单例设计模式介绍单例设计模式八种方式饿汉式 - 静态常量饿汉式(静态常量)应用实例优缺点说明饿汉式 - 静态代码块饿汉式(静态代码块)应用实例优缺点说明懒汉式 - 线程不安全懒汉式线程不安全应用实例优缺点说明懒汉式 - 线程安全,同步方法懒汉式线程安全,同步方法应用实例优缺点说明懒汉式 - 线程安全,同步代码块懒汉式 线程安全,同步代码块应用实例优缺点说明懒汉式 - 双重检查 - 推

霍英俊 1735

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

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

weixin_46437504的博客 268

23种设计模式 Java 单例模式

设计模式分类 创建型模式 用于描述“怎样创建对象”,它的主要特点是将对象的创建与使用分离 GoF (四人组) 书中提供了单例,原型,工厂方法,抽象工厂,建造者等 5种创建型模式 单例设计模式 单例模式概念 单例模式 是JAVA 中最简单的设计模式之一 这种类型的设计模式属于创建型模式 他提供了一种创建对的最佳方式 这种模式设计一个单一的类 该类负责创建自己的对象 用时确保只有单个对象被创建 这个类提供了一种访问其唯一的对象的方式。 单例模式的实现 饿汉式 饿汉式:类加载就是导致该单实例对象被创建 类加载的时

m0_46937429的博客 1217

java设计模式之单例模式

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

qq_41367934的博客 272

Java设计模式--单例模式

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

BUG-DEV 188

Java设计模式之容器单例模式

Java设计模式之容器单例模式 public class ContainerSingleton { private ContainerSingleton(){} private static Map<String , Object> map=new HashMap<>(); public static void putInstance(Str...

Crook的专栏 1755
上一篇: Java设计模式之建造者模式
下一篇: Java设计模式之装饰器模式
~小爷.
博客等级 码龄9年 26粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值