当前位置: 首页 > 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…...

开源fNIRS脑机接口帽技术解析与应用

1. 开源可穿戴fNIRS脑机接口帽技术解析在神经工程领域&#xff0c;功能性近红外光谱&#xff08;fNIRS&#xff09;技术正逐渐成为研究大脑活动的重要工具。与传统的脑电图&#xff08;EEG&#xff09;或功能磁共振成像&#xff08;fMRI&#xff09;相比&#xff0c;fNIRS具有独…...

OAuthlib错误诊断实战:从invalid_grant到temporarily_unavailable根因定位

1. 为什么OAuthlib的错误信息总让你一头雾水&#xff1f;你刚在Flask或Django项目里集成OAuth2登录&#xff0c;用户点“用GitHub登录”后页面直接报500&#xff0c;控制台只甩出一行红字&#xff1a;oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad r…...

GPT-4的1.8T参数与2%激活率:MoE架构原理与工程真相

1. 项目概述&#xff1a;参数规模与稀疏激活的真相拆解“GPT-4 Has 1.8 Trillion Parameters. It Uses 2% of Them Per Token.”——这句话过去两年在技术社区反复刷屏&#xff0c;常被当作“大模型已突破算力瓶颈”的佐证&#xff0c;也常被误读为“GPT-4只用360亿参数&#x…...

新高考答题卡模板全套PDF可打印(语文数学英语等)

新高考答题卡模板 PDF&#xff08;可下载、可打印&#xff09;汇总&#xff0c;涵盖全国卷及多个省市自主命题版本&#xff0c;包括&#xff1a;语文答题卡&#xff1a;全国一卷、全国二卷、上海卷、北京卷数学答题卡&#xff1a;全国一卷、全国二卷、北京卷、上海卷、天津卷英…...

私有化 IM vs 公有云 IM:3 个维度告诉你该怎么选

企业在选择即时通讯工具时&#xff0c;常常陷入 “功能越多越好” 的误区。实际上&#xff0c;IM 选型的本质是一次数据治理策略的决策。私有化 IM 和公有云 IM 没有绝对的好坏&#xff0c;只有适合不适合。今天我们从三个核心维度&#xff0c;帮你做出正确的选择。第一个维度&…...

ElevenLabs江苏话语音模型训练全链路拆解:从200小时带标注吴语语料清洗,到MOS得分达4.13的关键超参组合

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs江苏话语音模型训练全链路拆解&#xff1a;从200小时带标注吴语语料清洗&#xff0c;到MOS得分达4.13的关键超参组合 语料清洗与方言对齐策略 针对原始200小时江苏话&#xff08;含苏州、无…...

终极指南:在Windows系统上完整解锁MacBook Pro Touch Bar功能

终极指南&#xff1a;在Windows系统上完整解锁MacBook Pro Touch Bar功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为MacBook Pro在Windows系统中Touch…...

Python机器学习模型部署实战:从训练到生产环境

Python机器学习模型部署实战&#xff1a;从训练到生产环境 引言 作为从Python转向Rust的后端开发者&#xff0c;我深刻体会到机器学习模型部署的重要性。一个优秀的模型如果不能成功部署到生产环境&#xff0c;其价值将大打折扣。本文将从实战角度出发&#xff0c;详细介绍Pyth…...

AI Agent预测式防御:毫秒级故障预判与柔性干预

1. 项目概述&#xff1a;这不是又一个“AI Agent故障复盘”&#xff0c;而是一次对失败根因的工程化反演 你有没有遇到过这样的情况&#xff1a;花两周时间精心设计了一个AI Agent流程&#xff0c;接入了最新版的LLM API&#xff0c;配置了多层工具调用和记忆机制&#xff0c;测…...

AI Agent 运行时革命:从上下文牢笼到可审计的会话日志

1. 这不是新赛道&#xff0c;是 runtime 层的“操作系统时刻”来了 你有没有试过让一个 AI 代理连续工作四十分钟&#xff1f;不是闲聊&#xff0c;而是真正在查资料、调 API、写代码、改文档——一环扣一环地推进一个复杂任务。我去年就带着团队跑过这样一个销售线索深度分析 …...