【Java SE】单例设计模式

参考笔记:深入理解Java设计模式:单例模式及其饿汉式与懒汉式的对比,-CSDN博客

目录

1.什么是设计模式

2.经典设计模式

3.单例设计模式(static属性/方法经典使用场景 )

3.1 饿汉式单例模式

3.2 懒汉式单例模式

4.补充


1.什么是设计模式

设计模式是在大量的实践中总结和理论化之后优的代码结构、编程风格、以及解决问题的思考方式

2.经典设计模式

经典的设计模式共 23 种 

① 创建型模式,共 5 种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

② 结构性模式,共 7 种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

③ 行为型模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式


3.单例设计模式(static属性/方法经典使用场景 )

单例设计模式:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

单例设计模式主要有以下三个特点:

① 只能有一个实例
② 必须自己创建自己的唯一实例  
③ 必须给所有其他对象提供这一实例

3.1 饿汉式单例模式

① 特点:立即加载,类加载时就会把 single 创建完毕

② 优点:实现简单,不会有多线程安全问题

③ 缺点:当类加载时,会初始化 static 变量,静态变量被创建并分配内存空间。从这以后,这个 sttaic 的实例便一直占着这块内存,直到类被卸载时,静态变量被销毁,并解释所占用的内存空间。因此饿汉式单例模式在特定条件下会耗费内存

public class Test {public static void main(String[] args) {Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//饿汉式单例模式
class Singleton {private String name;// 1.私有化构造器,防止直接在其他类new对象private Singleton(String name) {this.name = name;}// 2.内部提供一个当前类的实例// 4.为了能够在静态方法getInstance中返回变量,single也必须静态化(静态方法只能调用静态属性/方法)private static Singleton single = new Singleton("小马");// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {return single;}@Overridepublic String toString() {return "Singleton{" +"name='" + name + '\'' +'}';}
}

3.2 懒汉式单例模式

先看代码,后面再总结

public class Test {public static void main(String[] args) {//single1和single2是同一对象Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//懒汉式单例模式
class Singleton {// 1.私有化构造器private Singleton() {}// 2.内部提供一个当前类的实例// 4.此实例也必须静态化private static Singleton single;// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {if(single == null) {single = new Singleton();}return single;}
}
/*输出结果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/

① 特点:延迟加载,只有在调用静态方法 getInstancesingle 才被分配内存空间

② 优点:实现简单

    (1)饿汉式在类加载时就创建了对象实例,但是可能这个对象后面没有用或者用的少,就造成浪费;

    (2)懒汉式在类加载时 static 实例未被创建和分配内存空间,只有当静态方法 getInstance 第一次被调用时才返回对象,再次调用时,返回的也是上次调用的对象,因此保证了仅一个实例对象

③ 缺点:在多线程环境中,该实现方法存在线程安全问题,不能保证单例的唯一性

说明: 3 个线程同时进入 if 语句中,new3 次,破环了单例设计模式的原则 

4.补充

JavaSE 类库中,java.lang.Runtime 就是经典的单例模式,且是饿汉式的 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【day2】数据结构刷题 栈

一 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

蓝桥杯 劲舞团

问题描述 小蓝最近迷上了一款名为 “劲舞团” 的游戏。 在游戏中,只要按照给出的键位提示依次按出对应的键位,游戏人物便可以跟随节奏跳舞。 对于连续的 K 次正确敲击,如果任意连续两次敲击之间的时间间隔都小于等于 1 秒(即 1…

数据库数值函数详解

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 数值函数是数据库中用于处理数值数据的函数,可以用于执行各种数学运算、统计计算等。数值函数在数据分析及处理时非常重要,能够帮助我们进行数据的聚合、计算和转换。在本篇博客中,我们将详细介绍常用的…

关于金融开发领域的一些专业知识总结

目录 1. 交易生命周期 1.1 证券交易所 1.1.1 交易前 1) 订单生成(Order Generation) 2) 订单管理(Order Management) 1.1.2 交易执行 3) 交易匹配(Trade Matching) 1.1.3 交易后 4) 交易确认&…

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解题思路2. 代码实现 题目链接:3495. Minimum Operations to Make Array Elements Zero 1. 解题思路 这一题的话核心就是统计对任意自然数 n n n,从 1 1 1到 n n n当中所有的数字对…

Vue 3 + TypeScript 实现视频播放与字幕功能:集成西瓜播放器 XGPlayer

文章目录 1. 前言:视频播放器的重要性2. 准备工作2.1 安装 Vue 3 项目2.2 安装 XGPlayer 和相关依赖 3. 实现视频播放3.1 初始化 XGPlayer 4. 添加字幕功能4.1 配置字幕 4.2 字幕文件格式5. 增加交互性完整的代码,仅供参考6. 总结 在现代 Web 开发中&…

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi,开发人员需要新的策略来保持高效。本文探讨了这些变化,并介…

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

📌 引言:为什么每个Java开发者都要懂JVM? 想象你是一名赛车手,Java是你的赛车,而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车,但要想在比赛中获胜,必须了解引擎如何工作&#…

怎么连接linux服务器的桌面

一、使用 VNC(Virtual Network Computing) 1. 服务器端配置(Ubuntu 22.04 示例) # 安装 VNC 服务器(以 TigerVNC 为例) sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-ext…

elasticsearch 通用笔记

文章目录 一、前言二、内容说明1、目录简介2、本文例子前提内容 三、操作内容1、设置ES为服务2、查看健康度参数解析 3、索引相关查询3.1、查询指定索引内容3.1.1、匹配查询3.1.2、精确匹配(不尝试分词)3.1.3、范围查询3.1.4、id查询3.1.5、通配符及前缀…

windows安装配置FFmpeg教程

1.先访问官网:https://www.gyan.dev/ffmpeg/builds/ 2.选择安装包Windows builds from gyan.dev 3. 下滑找到release bulids部分,选择ffmpeg-7.0.2-essentials_build.zip 4. 然后解压将bin目录添加path系统变量:\ffmpeg-7.0.2-essentials_bui…

强大的AI网站推荐(第二集)—— V0.dev

网站:V0.dev 号称:前端开发神器,专为开发人员和设计师设计,能够使用 AI 生成 React 代码 博主评价:生成的UI效果太强大了,适合需要快速创建UI原型的设计师和开发者 推荐指数:🌟&…

c#知识点补充4

1.发布者订阅模式 发布者 订阅者 俩者直接的关联使用

01、聊天与语言模型

一、简单说明模型 LLM目前有两种API提供 LanguageModel:接收一个a作为输入并返回一个b作为输出,这种是已经过时的ChatLanguageModel:接收多个输入,然后返回相应的输出 ChatLanguaggeModel是LangChain4j中LLM交互低级API&#x…

SQL的DCL,DDL,DML和DQL分别是什么

SQL(Structured Query Language)包括以下四种主要语言类别,分别用于不同的数据库操作: 1. DCL(Data Control Language,数据控制语言) 用于控制数据库访问权限和安全。 常见命令: …

spring boot maven一栏引入本地包

1、在项目跟目录下建立文件夹&#xff0c;比如libs 2、maven依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope>&l…

连续型随机变量及其分布

连续型随机变量 数学公式可以看作一门精确描述事物的语言&#xff0c;比语言尤其是汉语的模糊性精确多了&#xff01;离散型数据的处理可以通过枚举和相加进行处理。而连续型数据则没有办法这样处理。我们必须要通过函数和取值区间还有微积分计算。 &#xff3b;定义1&#x…

AI重构SEO关键词优化路径

内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则&#xff0c;存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统&#xff0c;能够穿透表层词汇限制&#xff0c;精准捕捉用户搜索意图的语义关联网络&#xff0c;结…

turnjs图册翻书效果

npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //记得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…