JAVA设计模式之单例模式

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

1.1 单例模式介绍

     单例模式是我们最常用的一种模式之一 , 当然对于初级的工程师可能是唯一会使用的设计模式 , 最近越来越发现设计模式是多么的重要 , 所以最近就专攻 <<设计模式>> 这个大山 , 首先我们先从最简单的来开始吧 !


1.2 单例模式的定义

      Ensure a class has only one instance, and provide a global point of access to it.

      (确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)


1.2.1单例模式的缺点

  单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。单例模式为什么不能增加接口呢?

  因为接口对单例模式是没有任何意义的,它要求“自行实例化”,并且提供单一实例、接口或抽象类是不可能被实例化的。

  当然,在特殊情况下,单例模式可以实现接口、被继承等,需要在系统开发中根据环境判断。
  单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行
  测试的,没有接口也不能使用mock的方式虚拟一个对象。
  单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,  单例模式把  “要单例”和业务逻辑融合在一个类中。


1.2.2单例模式的使用场景

  在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体的场景如下:
  ● 要求生成唯一序列号的环境;
  ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
  ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
  ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当
然,也可以直接声明为static的方式)。


1.3 单例模式关键点

      (1) 构建函数权限不对外开放 , 一般为Private

       (2) 通过公共静态方法返回单例对象

       (3) 确保只有一个实例 , 尤其是在多线程下


1.4 单例模式代码示例

      单例模式一般分为两个模式: (1) 饿汉式  (2) 懒汉式

      1.4.1 懒汉式

私有化构造函数和实例初始化,对外界提供一个静态方法判空并提供实例对象,保证只有一个实例

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-26.
 */

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

      1.4.2 饿汉式

实例化一个私有的实例对象通过静态方法返回给使用者,保证只有一个实例

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-26.
 */

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
    }

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

1.5 单例模式的其他实现方式

      1.5.1 懒汉式

下面这个大家会发现多出一个synchronized方法这个就是我们之前说的确保一个实例尤其实在多线程下,我们可以通过synchronized方法进行同步,来保证唯一实例对象

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-26.
 */

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

      1.5.2 Double Check Lock (DCL)实现实例

大家在看的过程中会发现有两个判空,为什么呢? 这是因为如果我们不加第一个判断的话每使用一次都将进行同步,这样会消耗不必要的资源 , 这也是懒汉式存在最大的问题

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-26.
 */

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
    }

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

      1.5.3 静态内部类单例实现

下面这个当我们加载Singleton的时候并不会实例化,只有在调用getInstance方法才会导致single被初始化

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-26.
 */

public class Singleton {

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingleHolder.single;
    }

    private static class SingleHolder {
        private static final Singleton single = new Singleton();
    }
}

      1.5.4 枚举

package com.example.liangshaoteng.imageloader;

import static com.example.liangshaoteng.imageloader.single.SINGLE;

/**
 * Created by liangshaoteng on 17-6-26.
 */

enum single{
    SINGLE;
    
    public void doSomething(){
        
    }
}




 

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

相关推荐

Android中Rxjava实现三级缓存的两种方式

主要介绍了Android中Rxjava实现三级缓存的两种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

ubuntu - 安装有道词典

首先我们下载有道词典的安装包 : 点击打开链接  下载完成后 : youdao-dict_1.1.0-0-deepin_amd64 (可执行文件)点击安装 , 安装成功后 :

梁少腾的博客 565

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 498

RecyclerView的简单使用

一       package com.example.liangshaoteng.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager

梁少腾的博客 684

KEIL MDK 生成bin文件实战:C51与ARM双平台配置指南

本文详细介绍了在KEIL MDK开发环境中,为C51和ARM双平台自动生成BIN文件的实战方法。针对C51平台,通过srec_cat.exe工具编写批处理脚本并集成到KEIL;针对ARM平台,则利用fromelf.exe工具直接配置。文章还提供了通用脚本方案和路径、变量、版本兼容性等常见问题的避坑指南,帮助开发者高效完成嵌入式程序部署。

weixin_29188997的博客 346

AD23导出Gerber文件保姆级教程:从PCB到嘉立创下单,一步不落(附常见问题排查)

本文提供AD23导出Gerber文件的详细教程,涵盖从PCB设计检查到嘉立创下单的全流程,特别针对两层板设计场景,帮助新手工程师避免常见错误。内容包括Gerber文件生成步骤、钻孔文件设置、文件检查工具推荐以及嘉立创下单实操指南,确保PCB打样顺利。

weixin_30924239的博客 440

JAVA设计模式之命令模式

一、命令模式的定义 命令模式是一个高内聚的模式 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 二、命令模式的优点 1、类间解耦     调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。 2、可扩

梁少腾的博客 509

Matlab实战:用递归最小二乘法(RLS)搞定动态系统参数辨识(附完整代码)

本文通过Matlab实战,详细介绍了如何利用递归最小二乘法(RLS)进行动态系统参数辨识。文章从理论优势切入,提供了完整的仿真数据生成、RLS算法核心实现代码,并对参数收敛过程、预测误差及不同遗忘因子的影响进行了可视化分析与性能评估,为工程实践提供了清晰的指南。

weixin_29035405的博客 503

三级缓存

本文章可以学到: 1、图片压缩 2、图片异步加载 3、内存缓存 4、本地缓存 5、网络缓存 6、MD5加密 代码下载: MyBitmapUtils //工具集 package com.example.liangshaoteng.mycache.Utils; import android.graphics.Bitmap; import android.util

梁少腾的博客 653

OpenCvSharp之利用海康相机采集图像并在pictureBox中显示

OpenCvSharp之利用海康相机采集图像并在pictureBox中显示 说明:OpenCvSharp版本为4.0 海康相机为黑白相机 实现功能:将海康相机采集的图像转成Mat,并在pictureBox中显示。 示例代码: Mat srcImage; private Mat CaptureImage() { int nRet; //MyCamera.MVCC_I...

Kevin_Sun777的博客 5501

泛微ecology9 利用字段值动态控制明细表显示与隐藏

本文详细介绍了在泛微ecology9中,如何利用WfForm.bindFieldChangeEvent监听字段变化,结合jQuery动态控制明细表显示与隐藏的实战方法。通过五步操作,可实现根据字段值(如报销类型)智能切换明细表,提升表单交互体验与开发效率,并确保PC与移动端完美兼容。

7z8x2c4v6b9的博客 585

详解Java设计模式之单例模式(Singleton Pattern)

单例模式只包含一个 Singleton(单例角色)类,在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以使用它的唯一实例。

Elegance never goes out of fashion 2745

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 247

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

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

Ping 365

从 30 天试用到企业级落地,2026 年学习和试用 SAP AI 的完整路线图

摘要:SAP AI产品体系存在试用版本与商业版本的边界模糊问题,需区分业务嵌入AI(如Joule)、开发者工具(SAP Build Code)和AI基础平台(Generative AI Hub)三个层级。建议学习路径:1)通过SAP Learning专区掌握理论框架;2)优先使用30天Generative AI Hub基础试用体验模型编排;3)结合90天BTP试用账户开发完整应用。特别注意免费计划已陆续停止,需以最新官方文档为准。开发者应重点关注AI如何与SAP技术栈(CAP、Fiori等)集成,而非单纯功

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

Devexpress16.2.6破解工具

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

Java 设计模式 二 单例模式 (Singleton Pattern)

单例模式是一种非常常见且有用的设计模式,能够确保类只有一个实例,并且提供全局访问点。在 Java 中,推荐使用静态内部类单例模式和枚举单例模式,这两种方式在性能、线程安全性和代码简洁性上都非常优秀。

空 1307

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

本文中介绍了几种实现单例的方法,主要包括饿汉、懒汉、使用静态内部类、双重校验锁、枚举等。还介绍了如何防止序列化破坏类的单例性。从单例的实现中,我们可以发现,一个简单的单例模式就能涉及到这么多知识。在不断完善的过程中可以了解并运用到更多的知识。所谓学无止境。

白话机器学习 261

visio安装包

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

Java常用设计模式-单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式 特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例 懒汉式: package com.example; /** * 懒汉式 * 加锁 synchronized线程安全 */ public class Stu...

gang_luo的博客 433

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)

 单例模式是 Java 众多设计模式的一种,也是平时用到较多、适用范围较广的一种设计模式,隶属创建型模式。 什么设计模式?说白了就是问题的解决方案,计算1加到100可以每个数字逐个加,也可以像高斯一样首尾相加乘50,设计模式是对问题的一种优秀的解决方案,所以我们需要来看看单例模式这个答案出现之前,所存在的问题: 假设有一个类 它的对象需要被频繁的使用,所以经常需要创建与销毁,而恰...

Decmoon的博客 348

java23种设计模式之一: 单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是设计模式中比较常用的一种,下面来总结单例模式的知识,包括: 1、理解什么是单例模式、单例模式有什么优点/缺点、单例模式的应用场景; 2、再来看看Java单例模式的6种代码实现方式、每种实现方式有什么需要注意的; 3、后面再来了解Java单例模式其他值得关注的地方,如比较静态方法、以及Java反...

255

Java设计模式—单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是一种创建型设计模式,一种非常非常常用的设计模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点;饿汉式:类加载时就创建了对象实例,因此线程安全,但会造成资源浪费;懒汉式:只有在需要时才创建对象实例,节省了系统资源,但需要考虑线程安全问题;双重校验锁:在懒汉式的基础上加入双重校验,保证了线程的安全且减少了锁的“竞争”;饿汉式:类加载时创建对象实例。懒汉式:只有在需要的时候才创建对象实例。

是个非常热爱生活、乐观、奋斗、努力的逗比青年 712

JAVA23种设计模式之单例模式(Singleton Pattern)

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个

fuu123f的博客 221

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

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

weixin_46081857的博客 418

Java设计模式之单例模式

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 简介 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

weixin_46186831的博客 153
上一篇: Java Executors(线程池)
下一篇: JAVA设计模式之Builder模式
有志青年L
博客等级 码龄10年 30粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值