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

Qwen3-VL-8B-Instruct-GGUF效果展示:上传图片秒出中文描述,实测高清准确

Qwen3-VL-8B-Instruct-GGUF效果展示&#xff1a;上传图片秒出中文描述&#xff0c;实测高清准确 想象一下&#xff0c;你随手拍了一张照片&#xff0c;上传到一个工具里&#xff0c;几秒钟后&#xff0c;一段详细、准确、甚至带点文采的中文描述就自动生成了。这听起来像是科幻…...

FICO批量修改资产字段AR31:替代规则失效的排查与修复

1. 替代规则失效的典型场景 最近在SAP FICO模块实施过程中&#xff0c;遇到一个挺有意思的问题。财务部门需要对大批量资产进行成本中心调整&#xff0c;要求按照不同使用日期切换不同的成本中心。听起来是个很常规的需求对吧&#xff1f;我们按照标准流程在GGB1配置了替代规则…...

可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据

下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容&#xff08;原文5665字&#xff09;。 2篇2章6节&#xff1a;R的多重填补法中随机回归填补法的应用&#xff0c;MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中&#xff0c;缺失数据是常见且具有挑战性…...

OpenClaw定时任务:GLM-4.7-Flash自动生成日报与周报

OpenClaw定时任务&#xff1a;GLM-4.7-Flash自动生成日报与周报 1. 为什么需要自动化日报周报 每周五下午&#xff0c;我的心情总是特别复杂——既期待周末的到来&#xff0c;又头疼要花1-2小时整理本周工作内容。更不用说每天下班前&#xff0c;还要花15分钟写日报。这种重复…...

Prometheus动态服务发现实战:从文件到K8S的三种配置方法对比

Prometheus动态服务发现实战&#xff1a;文件、Consul与Kubernetes的深度对比 在云原生监控体系中&#xff0c;服务发现机制如同神经系统般实时感知基础设施变化。当面对混合架构时&#xff0c;如何在文件、Consul和Kubernetes三种主流方案中做出技术选型&#xff1f;本文将带…...

GNSS/SINS组合导航实战:静基座精对准中的卡尔曼滤波参数调优技巧

GNSS/SINS组合导航实战&#xff1a;静基座精对准中的卡尔曼滤波参数调优技巧 在嵌入式导航系统开发中&#xff0c;静基座精对准是确保初始姿态精度的关键环节。许多工程师在调试卡尔曼滤波器时&#xff0c;常陷入参数试错的困境——Q矩阵该设多大&#xff1f;R矩阵如何匹配传感…...

Anthropic在非高峰时段将Claude使用量翻倍但不会永久持续

AI实验室持续寻找方式将开发者更深入地吸引到其生态系统中。最新举措来自Anthropic公司&#xff0c;该公司表示将在非高峰时段将其Claude助手的使用限制翻倍——这一短期优惠或许更多地反映了对开发者关注度的竞争&#xff0c;而非单纯的慷慨。Anthropic表示此次促销活动为期两…...

【Squoosh CLI】谷歌开源命令行图片批量压缩工具实战指南

1. 为什么你需要Squoosh CLI&#xff1f; 每次打开设计稿文件夹看到几十张未压缩的图片时&#xff0c;我都忍不住头皮发麻。作为前端开发&#xff0c;我经历过太多因为图片体积过大导致的页面加载缓慢问题。直到发现了谷歌开源的Squoosh CLI工具&#xff0c;这个命令行神器彻底…...

如何在Linux内核中实现高性能exFAT文件系统读写支持?

如何在Linux内核中实现高性能exFAT文件系统读写支持&#xff1f; 【免费下载链接】exfat-nofuse Android ARM Linux non-fuse read/write kernel driver for exFat and VFat Android file systems 项目地址: https://gitcode.com/gh_mirrors/ex/exfat-nofuse 你是否曾经…...

智能客服语音定制不求人:IndexTTS 2.0企业级应用部署指南

智能客服语音定制不求人&#xff1a;IndexTTS 2.0企业级应用部署指南 1. 为什么企业需要智能语音定制&#xff1f; 想象一下这样的场景&#xff1a;当客户拨打客服热线时&#xff0c;听到的不再是机械冰冷的标准化语音&#xff0c;而是与品牌调性完美契合的温暖声线&#xff…...