当前位置: 首页 > news >正文

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

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
      • 1)懒汉式
      • 2)饿汉式
    • 4. 应用示例
    • 结语

在软件开发中,单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式在需要控制某些资源,如数据库连接池、线程池等共享资源的情况下非常有用。在本文中,我们将介绍 Java 设计模式中的单例模式,了解其实现方式、使用场景以及如何在实际开发中应用。

1. 定义

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点,使得这个实例可以被全局范围内的代码所访问。单例模式的主要目的是控制某个类的实例数量,确保在整个应用程序中只有一个实例存在。

2. 应用场景

单例模式的应用场景包括但不限于以下情况:

  • 资源共享:

    当多个地方需要共享某个资源时,可以使用单例模式确保全局只有一个实例,避免资源浪费

  • 配置管理:

    单例模式可以用于全局配置管理,确保整个系统共享同一份配置信息

  • 日志记录:

    记录应用程序操作日志的时候,单例模式可以确保全局只有一个日志对象,方便集中管理

3. 代码实现

在 Java 中,实现单例模式有多种方式,下面是其中两种常用的方式:

1)懒汉式

懒汉式是指在第一次使用时才创建实例。这种方式延迟了对象的创建时间,但需要注意多线程下的安全性

package com.cheney.demo.singleton;public class LazySingleton {private static LazySingleton instance;// 私有构造方法,防止外部实例化private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

上述实现使用了 synchronized 关键字确保多线程环境下的安全性,但这也带来了性能开销

为了减少锁的粒度,可以使用双重检查锁方式

package com.cheney.demo.singleton;public class DoubleCheckedLazySingleton {private static volatile DoubleCheckedLazySingleton instance;// 私有构造方法,防止外部实例化private DoubleCheckedLazySingleton() {}public static DoubleCheckedLazySingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLazySingleton.class) {if (instance == null) {instance = new DoubleCheckedLazySingleton();}}}return instance;}
}

2)饿汉式

饿汉式是指在类加载时就创建实例,不管是否会被使用。这种方式简单且线程安全,但可能造成资源浪费

package com.cheney.demo.singleton;public class DoubleCheckedLazySingleton {private static volatile DoubleCheckedLazySingleton instance;// 私有构造方法,防止外部实例化private DoubleCheckedLazySingleton() {}public static DoubleCheckedLazySingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLazySingleton.class) {if (instance == null) {instance = new DoubleCheckedLazySingleton();}}}return instance;}
}

4. 应用示例

假设我们有一个需要记录日志的应用程序,我们希望使用单例模式管理日志对象

package com.cheney.demo.singleton;import java.util.ArrayList;
import java.util.List;public class Logger {private static Logger instance;private List<String> logEntries;private Logger() {logEntries = new ArrayList<>();}public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {logEntries.add(message);System.out.println("[Log] " + message);}public List<String> getLogEntries() {return logEntries;}
}

在使用中,我们通过 Logger.getInstance() 获取 Logger 的实例,并记录日志

package com.cheney.demo.singleton;import java.util.List;public class Main {public static void main(String[] args) {Logger logger = Logger.getInstance();logger.log("Hello...");logger.log("Cheney...");List<String> logEntries = logger.getLogEntries();System.out.println("收集到的日志内容:");for (String entry : logEntries) {System.out.println(entry);}}
}

运行结果

在这里插入图片描述

结语

单例模式是一种常见且实用的设计模式,它可以确保在整个应用程序中只有一个实例存在。在选择懒汉式或饿汉式实现方式时,需要根据具体的需求和性能考虑来选择合适的方式。在实际开发中,单例模式通常用于管理共享资源、配置信息等全局唯一的对象。通过合理使用单例模式,可以提高系统的灵活性和可维护性。

相关文章:

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

文章目录 1. 定义2. 应用场景3. 代码实现1&#xff09;懒汉式2&#xff09;饿汉式 4. 应用示例结语 在软件开发中&#xff0c;单例模式是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式在需要控制某些资源&#xff0c;如数…...

FlinkAPI开发之窗口(Window)

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流的&#xff0c;数据源源不断、无穷无尽。…...

【Unity】Joystick Pack摇杆插件实现锁四向操作

Joystick Pack ​ 简介&#xff1a;一款Unity摇杆插件&#xff0c;非常轻量化 ​ 摇杆移动类型&#xff1a;圆形、横向、竖向 ​ 摇杆类型&#xff1a; Joystick描述Fixed固定位置Floating浮动操纵杆从用户触碰的地方开始&#xff0c;一直固定到触碰被释放。Dynamic动态操纵…...

29 旋转工具箱

效果演示 实现了一个菜单按钮的动画效果&#xff0c;当鼠标悬停在菜单按钮上时&#xff0c;菜单按钮会旋转315度&#xff0c;菜单按钮旋转的同时&#xff0c;菜单按钮旋转的8个小圆圈也会依次旋转360度&#xff0c;并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反&#xff0…...

WeNet2.0:提高端到端ASR的生产力

摘要 最近&#xff0c;我们提供了 WeNet [1]&#xff0c;这是一个面向生产&#xff08;工业生产环境需求&#xff09;的端到端语音识别工具包&#xff0c;在单个模型中&#xff0c;它引入了统一的两次two-pass (U2) 框架和内置运行时&#xff08;built-in runtime&#xff09;…...

第九部分 使用函数 (四)

目录 一、foreach 函数 二、if 函数 三、call 函数 一、foreach 函数 foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的&#xff0c;Makefile 中的 foreach 函数几乎是仿照于 Unix 标准 Shell&#xff08;/bin/sh&#xff09;中的 for 语句&#xff0c;或…...

一文读懂「Prompt Engineering」提示词工程

在了解提示过程之前&#xff0c;先了解一下什么是提示prompt&#xff0c;见最后附录部分 一、什么是Prompt Engingering&#xff1f; 提示工程&#xff08;Prompt Engingering&#xff09;&#xff0c;也被称为上下文提示&#xff08;In-Context Prompting&#xff09;&#x…...

微信小程序(一)简单的结构及样式演示

注释很详细&#xff0c;直接上代码 涉及内容&#xff1a; view和text标签的使用类的使用flex布局水平方向上均匀分布子元素垂直居中对齐子元素字体大小文字颜色底部边框的宽和颜色 源码&#xff1a; index.wxml <view class"navs"><text class"active…...

【设计模式】外观模式

前言 1. 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;保证一个类只有一个实例&#xff0c;并提供一个全局的访问点。 2. 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;定义一个创建对象的接口&#xff0c;但由子类决定要实例化的类是哪一…...

优先级队列(Priority Queue)

文章目录 优先级队列&#xff08;Priority Queue&#xff09;实现方式基于数组实现基于堆实现方法实现offer(E value)poll()peek()isEmpty()isFull() 优先级队列的实现细节 优先级队列&#xff08;Priority Queue&#xff09; 优先级队列是一种特殊的队列&#xff0c;其中的元素…...

12-桥接模式(Bridge)

意图 将抽象部分与它的实现部分分离&#xff0c;使他们可以独立地变化 个人理解 一句话概括就是只要是在抽象类中聚合了某个接口或者抽象类&#xff0c;就是使用了桥接模式。 抽象类A中聚合了抽象类B&#xff08;或者接口B&#xff09;&#xff0c;A的子类的方法中在相同的场…...

Zookeeper+Kafka概述

一 Zookeeper 1.1 Zookeeper定义 Zookeeper是一个开源的、分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1.2 Zookeeper特点 Zookeeper&#xff1a;一个领导者&#xff08;leader&#xff09;&#xff0c;多个跟随者&#xff08;Follower&#xff09;组成的…...

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…...

全链路压测方案(一)—方案调研

一、概述 在业务系统中&#xff0c;保证系统稳定至关重要&#xff0c;直接影响线上业务稳定和性能。测试工作作为保证生产质量的最后一关&#xff0c;扮演者重要的角色。全链路压测是一种重要的测试工具和手段。可以解决系统中多环节多节点无法全流程打满流量的痛点问题&a…...

c++关键字const

C中的const是一种常量修饰符。在变量、函数参数和成员函数中使用const可以限制其对数据的修改。 const修饰的数据在定义时必须进行初始化&#xff0c;且不能被修改&#xff0c;因此使用const可以提高代码的安全性和可读性。在C中&#xff0c;const修饰的成员函数表示该函数保证…...

分布式计算平台 Hadoop 简介

Hadoop简介 Hadoop是一种分析和处理大数据的软件平台&#xff0c;是一个用Java语言实现的Apache的开源软件框架&#xff0c;在大量计算机组成的集群中实现了对海量数据的分布式计算。其主要采用MapReduce分布式计算框架&#xff0c;包括根据GFS原理开发的分布式文件系统HDFS、…...

系统学习Python——警告信息的控制模块warnings:常见函数-[warnings.warn]

分类目录&#xff1a;《系统学习Python》总目录 warnings.warn(message, categoryNone, stacklevel1, sourceNone, \*, skip_file_prefixesNone)常备用于引发警告、忽略或者触发异常。 如果给出category参数&#xff0c;则必须是警告类别类 &#xff1b;默认为UserWarning。 或…...

监听键盘事件vue3封装hooks

监听页面键盘事件&#xff0c;执行对应方法 使用第三方API&#xff1a;vueuse 我封装的&#xff1a; 1. useKeyboardEvent.ts import { useMagicKeys } from vueuse/coreexport function enterKey(f: Function) {const { enter } useMagicKeys()watch(enter, v > {if (…...

Java Stream简化代码

使用原始流以获得更好的性能 使用 int、long 和 double 等基本类型时&#xff0c;请使用IntStream、LongStream 和 DoubleStream 等基本流&#xff0c;而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能。 var array new i…...

py爬虫入门笔记(request.get的使用)

文章目录 Day11. 了解浏览器开发者工具2. Get请求http://baidu.com3. Post请求https://fanyi.baidu.com/sug4. 肯德基小作业 Day21. 正则表达式2. 使用re模块3. 爬取豆瓣电影Top250的第一页4. 爬取豆瓣电影Top250所有的250部电影信息 Day31. xpath的使用2. 认识下载照片线程池的…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...