创建型-单例模式

8位2路选择器设计 阅读详情

目录

定义

解决了什么问题(应用场景)

如何实现

饿汉式

懒汉式

双重检测

静态内部类

枚举

单例模式存在什么问题

是否有其它替代方案

参考资料


定义

一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

 

解决了什么问题(应用场景)

  • 从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。
  • 我们还可以使用单例解决资源访问冲突的问题。

 

如何实现

要实现一个单例,我们需要关注的点无外乎下面几个:

  • 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
  • 考虑对象创建时的线程安全问题;
  • 考虑是否支持延迟加载;
  • 考虑 getInstance() 性能是否高(是否加锁)。

 

饿汉式

在类加载的时候,instance 静态实例就已经创建并初始化好了。类加载是线程安全的 instance 自然也就是线程安全的。不过,这种实现方式不支持延迟加载。

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static final IdGenerator instance = new IdGenerator();

  private IdGenerator() {}

  public static IdGenerator getInstance() {

    return instance;

  }

  public long getId() {

    return id.incrementAndGet();

  }

}

懒汉式

支持延迟加载,不过并发度低

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static IdGenerator instance;

  private IdGenerator() {}

  public static synchronized IdGenerator getInstance() {// 加了一把粒度很大的锁,导致并发度低

    if (instance == null) {

      instance = new IdGenerator();

    }

    return instance;

  }

  public long getId() {

    return id.incrementAndGet();

  }

}

 

双重检测

支持延迟加载,并发度高

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static IdGenerator instance;

  private IdGenerator() {}

  public static IdGenerator getInstance() {

    if (instance == null) {

      synchronized(IdGenerator.class) { // 此处为类级别的锁

        if (instance == null) {

          instance = new IdGenerator();

        }

      }

    }

    return instance;

  }

 

  public long getId() {

    return id.incrementAndGet();

  }

}

静态内部类

实现简单,支持延迟加载

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private IdGenerator() {}

 

  private static class SingletonHolder{

    private static final IdGenerator instance = new IdGenerator();// 是线程安全的

  }

   

  public static IdGenerator getInstance() {

    return SingletonHolder.instance;

  }

  

  public long getId() {

    return id.incrementAndGet();

  }

}

枚举

枚举个锤子

最简单的实现方式,基于枚举类型的单例实现。这种实现方式通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。

public enum IdGenerator {

  INSTANCE;

  private AtomicLong id = new AtomicLong(0);

  

  public long getId() {

    return id.incrementAndGet();

  }

}

 

单例模式存在什么问题

42讲,没看懂

是否有其它替代方案

使用工厂模式,使用依赖注入

参考资料

极客时间--设计模式之美--第41讲,42讲,43讲

【云原生技术】helm中Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用 Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用 在一个标准的 Helm Chart 中,通常会包含以下关键文件: - **Chart.yaml** - **values.yaml** - **templates/`_helpers.tpl`** - 以及若干模板文件(`deployment.yaml`、`service.yaml` 等) 下面分别介绍这几个文件的作用、常见字段及其含义。 阅读详情

相关推荐

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

单例模式的几种实现方式(JAVA)

单例模式的几种实现方式(JAVA) 概括起来,要实现一个单例,我们需要关注的点无外乎下面几个: 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例; 考虑对象创建时的线程安全问题;考虑是否支持延迟加载; 考虑 getInstance() 性能是否高(是否加锁)。 1、饿汉式 饿汉式的实现方式比较简单。在类加载的时候,instance 静态实例就已经创建并初始化好...

huchao_lingo的博客 1534

Android dex, odex, oat, vdex, art文件介绍

下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式

he980725866的博客 3621

设计模式 ~ 创建型模式 ~ 单例模式 ~ Singleton Pattern。

设计模式 ~ 创建型模式 ~ 单例模式 ~ Singleton Pattern。

lyfGeek的博客 403

STM32+HX711实战:5分钟搞定拉力传感器数据采集(附完整代码)

本文详细介绍了如何使用STM32微控制器和HX711模数转换器快速搭建高精度拉力测量系统。通过硬件连接指南、驱动实现代码和校准方法,帮助开发者在5分钟内完成拉力传感器数据采集,适用于工业自动化和消费电子等场景。

y7z8a9的博客 877

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5299

创建型模式之单例模式(Singleton Pattern)

  单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。   单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。 单例模式的几种实现方式 1、懒汉式,线程不安全 这种方式是最基本的实现方式,这种实现最大的问题就...

衣人之衣者,怀人之忧;食人之食者,死人之事! 960

AMD KFD的SDMA Packet 类型和定义解析

本文详细分析了AMD GPU架构中的SDMA(System Direct Memory Access)数据传输机制,重点介绍了其核心数据结构——SDMA Packet。SDMA通过8种主要Packet类型(包括内存拷贝、数据写入、屏障同步、中断触发等)实现高效主机-设备通信。每种Packet采用位域结构和联合体封装设计,在保证功能完整性的同时实现空间优化。这些Packet支持丰富的访问属性和扩展字段,适用于高性能数据搬运、内存初始化、任务同步、性能分析等场景,为GPU计算提供了灵活高效的数据传输解决方案。

图形/计算GPU的驱动与虚拟化技术分享园地 1255

创建型模式——单例模式(Singleton Pattern)

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

qq_46658171的博客 894

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1106

【数据分析】基于多组学数据整合的微生物与宿主互作网络构建及可视化分析

综上所述,本教程通过详细的步骤和方法,展示了如何整合微生物群落数据、宿主基因表达数据和代谢组数据,构建微生物与宿主互作网络,并进行可视化分析。这种方法为研究微生物与宿主之间的复杂关系提供了一种有力的工具,有助于推动相关疾病的研究和治疗。然而,在实际应用中,需要注意数据处理和分析过程中的各种问题,并结合实验验证来提高研究结果的可靠性和科学性。未来,随着多组学技术的不断发展和完善,以及数据分析方法的创新,相信我们能够更深入地理解微生物与宿主之间的互作机制,为疾病的预防、诊断和治疗提供更有力的支持。

专注生信领域 372

创建型-单例模式(Singleton Pattern)

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)枚举类实现单例模式是唯一一种不会被破坏的单例实现模式。输出结果为false。

babstyt的博客 972

3.1 5分钟搞定!Claude Code接入国产大模型完整教程(附代码)

摘要 本文提供了一份5分钟快速为Claude Code接入国产大模型的完整教程。首先介绍了系统环境要求(Windows/macOS/Linux、Node.js 18+、Python 3.8+),然后详细说明了三种安装Claude Code的方式(npm/yarn/pnpm)。重点讲解了两种国产大模型接入方案:通义千问(推荐)和文心一言,包括获取API密钥、安装SDK、创建MCP服务器、配置Claude Code等步骤。文中提供了详细的代码示例和配置文件模板,确保开发者能快速完成国产大模型的接入,降低使用成本

yonggeit的博客 7926

设计模式 - 创建型模式_ 单例模式 Singleton Pattern

单例模式常见的写法有: 懒汉式单例,饿汉式单例,登记式单例(可忽略)。单例模式特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一对象实例 单例模式确保某各类只有一个实例,而且自行实例化并向整个系统提供这个实例。比如我们常见的线程池 、缓存等等。选择单例模式就是为了避免不一致的状态,避免政出多头。懒汉式单例 特点: - 懒汉式单例在第一次调用的时候

小工匠 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

单例模式(Singleton Pattern)【创建型】

C#设计模式之一单例模式(Singleton Pattern)【创建型】 原文:C#设计模式之一单例模式(Singleton Pattern)【创建型】 一、引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的、有关设计模式的文章。这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍。写作的过程中也会多看看其他大...

LJianDong的博客 212

精雕软件(JDpaint) 5.5 绿色版

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

创建型模式--单例模式【Singleton Pattern】

单例模式定义 单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,且属于创建类模式。 Ensure that only one instance of a class is created. Provide a global point of access to the object. 单例模式类图 饿汉式单例 public...

thebigdipperbdx的博客 330

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

创建型模式——单例模式(Singleton pattern) 定义 当你的项目需要某一个类的实例化对象只有一个的时候,可以使用单例模式。单例模式因为只创建一个实例化对象,所以使用上更便利,性能和空间都能得到优化,但缺点是因为实例化只有一个导致类与类之间耦合性增加,并且还需要考虑线程安全的问题。 示例 /** * 单例设计类 */ public class Singleton { pri...

小迷糊的守护神 307

创建型设计模式: 单例模式(Singleton Pattern)

设计模式;结构型模式;创建型设计模式;单例模式(Singleton Pattern)保证一个类仅有一个实例,并提供一个访问它的全局访问点。Singleton模式属于创建型模式,创建型模式包括FactoryMethod模式,AbstractFactory模式,Singleton模式,ProtoType模式和Builder模式。

智能多媒体 408

单例模式(Singleton Pattern) – 设计模式之创建型模式

单例模式(Singleton Pattern) – 设计模式之创建型模式: 目录 单例模式(Singleton Pattern) 类图 单例实现方式: 饿汉: 懒汉: 双重校验锁: 静态内部类:比较推荐 枚举:推荐的方式 分析 总结: 使用场景 单例模式(Singleton Pattern) 定义:Ensure a class has only one instance, and provide a global point of access to it. 确保一个类只有一.

一路向前 461

创建型模式 - 单例模式

创建型模式 - 单例模式

qq_43350524的博客 857

创建型 - 单例模式(Singleton pattern)

单例模式(Singleton Pattern):确保一个类有且只有一个实例,并提供一个全局访问点。

Lifelong learning 5681

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

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

weixin_44050362的博客 791

03 创建型模式之单例模式(Singleton Pattern)

文章目录1 介绍1.1 单例模式结构1.2 单例模式的实现1.3 单例模式实现基本要求2 饿汉式2.1 静态变量方式2.2 静态代码块方式3 懒汉式3.1 方式1--线程不安全3.2 方式2--线程安全3.2 方式3--双重检查锁3.4 方式4(静态内部类方式)4 枚举方式实现5 破坏单例模式5.1 序列化方式破坏单例5.1.1 演示5.1.2 解决5.2 反射方式破坏单例5.2.2 解决 1 介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创

wyaoyao93的博客 278

【c++设计模式06】创建型4:单例模式(Singleton Pattern)

单例模式保证一个类只有一个实例,并且提供一个全局访问点来获取该实例。单例模式是一种创建型设计模式,用于确保一个类只有一个实例。它适用于需要控制资源共享访问权限的场景。单例模式可以分为懒汉式和饿汉式两种实现方式,并且需要注意线程安全性,可以使用互斥锁或双重检查锁定来保证线程安全。

junxuezheng的博客 1092

Singleton Pattern - 单例模式 - 创建型模式

参考: http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/singleton.html#id18 http://www.runoob.com/design-pattern/singleton-pattern.html 模式动机: 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多...

Lazyafei's Blog 272

设计模式:创建型模式--单例模式(Singleton Pattern)

设计模式:创建者模式——单例模式 文章目录设计模式:创建者模式——单例模式1. 概念2. 组成结构3. 实现方式3.1 饿汉式3.1.1 静态变量3.1.2 静态代码块3.1.3 枚举方式3.2 懒汉式3.2.1 非线程安全3.2.2 线程安全3.2.3 双重检查锁3.2.4 静态内部类4. 存在问题4.1 序列化反序列化4.2 反射机制 1. 概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种

ZZay's 649
上一篇: 自定义 Java ClassLoader
下一篇: 创建型-工厂模式
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值