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

23种设计模式

参考链接:

  • 【狂神说Java】通俗易懂的23种设计模式教学(停更)_哔哩哔哩_bilibili

  • 23种设计模式【狂神说】_狂神说设计模式_miss_you1213的博客-CSDN博客

1. 单例模式

参考链接:

  • 【狂神说Java】单例模式-23种设计模式系列_哔哩哔哩_bilibili

  • JAD Java Decompiler Download Mirror

1.1 饿汉式单例

 package com.study.singleton;​/*** @ClassName HungryMan* @Description 饿汉式单例模式【不安全】* @Author Jiangnan Cui* @Date 2023/3/20 22:24* @Version 1.0*/public class HungryMan {/*** 缺点:类加载期间就创建对象,容易造成资源浪费。即:当该类中放置了很多资源时,最开始加载可能会浪费空间,因为加载了也不使用。*/private byte[] data1 = new byte[1024*1204];private byte[] data2 = new byte[1024*1204];private byte[] data3 = new byte[1024*1204];private byte[] data4 = new byte[1024*1204];private byte[] data5 = new byte[1024*1204];​/*** 私有构造方法限制产生多个对象*/private HungryMan() {}​/*** 最开始就创建对象,保证只有一个对象*/private static final HungryMan HUNGRY_MAN = new HungryMan();​/*** 通过该方法获得实例对象* @return*/public static HungryMan getInstance(){return HUNGRY_MAN;}}​

1.2 懒汉式单例

 package com.study.singleton;​/*** @ClassName LazyMan* @Description 懒汉式单例模式:用的时候再创建【不安全】  *              单线程下安全,多线程下存在并发安全问题* @Author Jiangnan Cui* @Date 2023/3/20 22:33* @Version 1.0*/public class LazyMan {/*** 私有构造方法限制产生多个对象*/private LazyMan(){// 此处为了测试多线程并发安全问题System.out.println(Thread.currentThread().getName() + " is ok");}​private static LazyMan lazyMan = null;​/*** 通过该方法获得实例对象* @return*/public static LazyMan getInstance(){if (lazyMan == null) {lazyMan = new LazyMan();}return lazyMan;}​public static void main(String[] args) {// 多线程并发时存在线程安全问题for (int i = 0; i < 10; i++) {new Thread(()->{LazyMan.getInstance();}).start();}/*** 输出的一个结果举例:* Thread-0 is ok* Thread-3 is ok* Thread-2 is ok* Thread-1 is ok*/}}​

1.3 懒汉式单例-DCL

 package com.study.singleton;​import com.sun.org.apache.bcel.internal.generic.I2B;​import java.lang.reflect.Constructor;import java.lang.reflect.Field;​/*** @ClassName LazyMan2* @Description 懒汉式单例模式+双重锁校验优化+防止指令重排:DCL懒汉式【不安全】】*              解决多线程下存在并发安全问题* @Author Jiangnan Cui* @Date 2023/3/20 22:33* @Version 1.0*/public class LazyMan2 {private static boolean secret = false;// 红绿灯​/*** 私有构造方法限制产生多个对象*/private LazyMan2(){// 解决反射破坏单例问题synchronized (LazyMan2.class) {if (secret == false) {secret = true;} else {throw new RuntimeException("不要试图使用反射破坏异常!");}}// 此处为了测试多线程并发安全问题System.out.println(Thread.currentThread().getName() + " is ok");}​/*** 加volatile防止指令重排*/private volatile static LazyMan2 lazyMan2 = null;​/*** 通过该方法获得实例对象* @return*/public static LazyMan2 getInstance(){if (lazyMan2 == null) {synchronized (LazyMan2.class) {if (lazyMan2 == null) {/*** new对象的过程中,不是一个原子性操作* 1.分配内存空间* 2.执行构造方法,初始化对象* 3.把这个对象指向这个空间** CPU指令重排:1、3、2,此时lazyMan2还没有完成构造,需要加volatile保证指令不重排*/lazyMan2 = new LazyMan2();}}}return lazyMan2;}​public static void main(String[] args) throws Exception {/*** 反射可以破坏单例*///        LazyMan2 instance1 = LazyMan2.getInstance();​// 2.再次调用反射:获取字段,无视私有Field secret = LazyMan2.class.getDeclaredField("secret");secret.setAccessible(true);//无视私有构造器​// 1.利用反射Constructor<LazyMan2> declaredConstructor = LazyMan2.class.getDeclaredConstructor(null);// 无视私有构造器declaredConstructor.setAccessible(true);// 创建新对象LazyMan2 instance1 = declaredConstructor.newInstance();​// 3.重新设置secret.set(instance1, false);​        // 再次利用反射创建对象LazyMan2 instance2 = declaredConstructor.newInstance();​System.out.println("instance1 = " + instance1);System.out.println("instance2 = " + instance2);}}​

1.4 静态内部类

 package com.study.singleton;​/*** @ClassName StaticInnerClass* @Description 静态内部类单例模式【不安全】* @Author Jiangnan Cui* @Date 2023/3/20 23:31* @Version 1.0*/public class StaticInnerClass {private StaticInnerClass(){}​public static StaticInnerClass getInstance(){return InnerClass.STATIC_INNER_CLASS;}​public static class InnerClass {private static final StaticInnerClass STATIC_INNER_CLASS = new StaticInnerClass();}}​

1.5 枚举

 package com.study.singleton;​import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;​/*** @ClassName SingleEnum* @Description enum本身也是一个class类,jdk 1.5就有了* @Author Jiangnan Cui* @Date 2023/3/20 23:18* @Version 1.0*/public enum SingleEnum {INSTANCE;public SingleEnum getInstance(){return INSTANCE;}}​class Test{public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {SingleEnum instance1 = SingleEnum.INSTANCE;Constructor<SingleEnum> declaredConstructor = SingleEnum.class.getDeclaredConstructor(String.class, int.class);//注意此处并不是无参构造方法,实际有String、int两个参数,要通过反编译工具jad.exe才能验证declaredConstructor.setAccessible(true);//        SingleEnum instance2 = SingleEnum.INSTANCE;SingleEnum instance2 = declaredConstructor.newInstance();System.out.println("instance1 = " + instance1);System.out.println("instance2 = " + instance2);​}}​// Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objectsat java.lang.reflect.Constructor.newInstance(Constructor.java:417)at com.study.singleton.Test.main(SingleEnum.java:26)​

javap -p 类名.class反编译: 

 jad.exe反编译结果:

 

待完善

相关文章:

23种设计模式

参考链接&#xff1a; 【狂神说Java】通俗易懂的23种设计模式教学&#xff08;停更&#xff09;_哔哩哔哩_bilibili 23种设计模式【狂神说】_狂神说设计模式_miss_you1213的博客-CSDN博客 1. 单例模式 参考链接&#xff1a; 【狂神说Java】单例模式-23种设计模式系列_哔哩哔哩…...

20美刀一个月的ChatGPT架构师,性价比逆天了

文章目录20美刀一个月的ChatGPT架构师&#xff0c;性价比逆天了1.角色设定2.基本描述3.解决方案4.物理网络蓝图5.系统集成接口5.1 系统集成接口设计5.1.1 前端服务器与后端服务器接口&#xff1a;5.1.2 后端服务器与去背景处理服务接口&#xff1a;5.2 系统集成接口展示6.部署环…...

海门区教育科学规划课题2020年度成果鉴定书

海门区教育科学规划课题2020年度成果鉴定书 课题编号&#xff1a;HMGZ2020007 课题名称 中学历史核心素养校本化实施的培育研究 主持人 徐彬 工作单位 南通市海门证大中学 核心组成员 &#xff08;包括主持人&#xff09; 姓名 研究任务完成情况 &#xff08;获得的主要成果、…...

大数据专业应该怎么学习

大数据学习不能停留在理论的层面上&#xff0c;大数据方向切入应是全方位的&#xff0c;基础语言的学习只是很小的一个方面&#xff0c;编程落实到最后到编程思想。学习前一定要对大数据有一个整体的认识。 大数据是数据量多吗&#xff1f;其实并不是&#xff0c;通过Hadoop其…...

学习黑客十余年,如何成为一名高级的安全工程师?

1. 前言 说实话&#xff0c;一直到现在&#xff0c;我都认为绝大多数看我这篇文章的读者最后终究会放弃&#xff0c;原因很简单&#xff0c;自学终究是一种适合于极少数人的学习方法&#xff0c;而且非常非常慢&#xff0c;在这个过程中的变数过大&#xff0c;稍有不慎&#…...

【算法】手把手学会二分查找

目录 简介 基本步骤 第一种二分 第二种二分 例题 搜索插入位置 数的范围 总结 简介 &#x1f965;二分查找&#xff0c;又叫折半查找&#xff0c;通过找到数据二段性每次都能将原来的数据筛选掉一半&#xff0c;通过这个算法我们能够将一个一个查找的 O(n) 的时间复杂…...

SVO、vinsmono、 OKVIS系统比较

几个经典视觉slam系统的比较 SVO 高翔链接&#xff1a;https://www.zhihu.com/question/39904950/answer/138644975处理的各个线程: tracking部分-frame to frame 、frame to map 金字塔的处理。这一步估计是从金字塔的顶层开始&#xff0c;把上一层的结果作为下一层估计的初…...

前端开发规范

一、开发工具 开发工具统一使用 VSCode代码格式化插件使用 Prettier代码格式校验使用 ESLintVSCode 需安装的插件有&#xff1a;ESLint、Prettier、Vetur 二、命名规范 项目命名使用小写字母&#xff0c;以连字符分隔 正确&#xff1a;fe-project 错误&#xff1a;FE PROJECT…...

不用科学上网,免费的GPT-4 IDE工具Cursor保姆级使用教程

大家好&#xff0c;我是可乐。 过去的一周&#xff0c;真是疯狂的一周。 GPT-4 震撼发布&#xff0c;拥有了多模态能力&#xff0c;不仅能和GPT3一样进行文字对话&#xff0c;还能读懂图片&#xff1b; 然后斯坦福大学发布 Alpaca 7 B&#xff0c;性能匹敌 GPT-3.5&#xff…...

【艾特淘】抖音小店物流体验分提升的6个维度,新手做店必看

抖音小店体验分&#xff0c;考核的内容包括商品、物流以及服务。大部分人会把重心放在商品评价和服务上&#xff0c;忽略了物流体验。但其实&#xff0c;抖音小店物流体验占比有20%&#xff0c;比服务分的占比还高一点。如果你的订单物流出了问题&#xff0c;很有可能会导致用户…...

数据结构——二叉树与堆

作者&#xff1a;几冬雪来 时间&#xff1a; 内容&#xff1a;二叉树与堆内容讲解 目录 前言&#xff1a; 1.完全二叉树的存储&#xff1a; 2.堆的实现&#xff1a; 1.创建文件&#xff1a; 2.定义结构体&#xff1a; 3.初始化结构体&#xff1a; 4.扩容空间与扩容…...

Three.js——learn02

Three.js——learn02Three.js——learn02通过轨道控制器查看物体OrbitControls核心代码index2.htmlindex.cssindex2.jsresult添加辅助器1.坐标轴辅助器AxesHelper核心代码完整代码2.箭头辅助器ArrowHelper核心代码完整代码3.相机视锥体辅助器CameraHelper核心代码完整代码Three…...

零基础小白如何入门网络安全?

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b; 学习XXX技能没方向&#xff1b; 学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之…...

【前缀和】

前缀和前缀和子矩阵的和结语前缀和 输入一个长度为 n的整数序列。 接下来再输入 m 个询问&#xff0c;每个询问输入一对 l,r 对于每个询问&#xff0c;输出原序列中从第 l 个数到第 r个数的和。 输入格式第一行包含两个整数 n和 m 第二行包含 n个整数&#xff0c;表示整数…...

ChatGPT可以做WebRTC音视频质量性能优化,惊艳到我了

摘要 随着GPT-4的发布&#xff0c;AI的风越吹越旺。GPT-4可以回答问题&#xff0c;可以写作&#xff0c;甚至可以基于一张草图生成html代码搭建一个网站。即构社区的一位开发者倪同学就基于目前在研究的WebRTC QOS技术点对GPT-3.5跟GPT-4进行一场实验&#xff0c;ChatGPT会取代…...

MySQL数据库实现主从同步

安装MySQL数据库8.0.32 前言 今天来学习数据库主从同步的原理及过程&#xff0c;数据库主要是用来存储WEB数据&#xff0c;在企业当中是极为重要的&#xff0c;下面一起来看下。 1.1 数据库做主从的目的 MySQL主从复制在中小企业&#xff0c;大型企业中广泛使用&#xff0c…...

go语言gin框架学习

让框架去做http解包封包等&#xff0c;让我们的精力用在应用层开发 MVC模式 M: model&#xff0c;操作数据库gorm view 视图 处理模板页面 contoller 控制器 路由 逻辑函数 解决gin相关代码飘红的问题 记得启用gomodule go env -w GO111MODULEon然后到相应目录下执行 go mod i…...

Java奠基】Java经典案例讲解

目录 卖飞机票 找质数 开发验证码 数组元素的复制 评委打分 数字加密 数字解密 抢红包 模拟双色球 二维数组 卖飞机票 需求&#xff1a;机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格&#xff1a; 旺季&…...

新闻文本分类任务:使用Transformer实现

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

如何在 Vue 中使用 防抖 和 节流

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库 https://mp.weixin.qq.com/s?__bizMzU5NzA0NzQyNg&mid2247485824&idx3&sn70cd26a7c0c683de64802f6cb9835003&scene21#wech…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...