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 objects
     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
     at com.study.singleton.Test.main(SingleEnum.java:26)
 ​

javap -p 类名.class反编译: 

 jad.exe反编译结果:

 

待完善

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(网络基础---网络层)

文章目录0. 前言1. IP协议1-1 基本概念1-2 协议头格式2. 网段划分2-1 基本概念2.2 IP地址分五大类2-3 特殊的IP地址2-4 IP地址的数量限制2-5 私有IP地址和公网IP地址2-6 路由0. 前言 前面我们讲了&#xff0c;应用层、传输层&#xff1b;本章讲网络层。 应用层&#xff1a;我…

GPT-4是个编程高手,真服了!

上周给大家发了一个GPT-4教数学的介绍&#xff0c;很多人都被震撼了&#xff0c;感觉有可能在教育行业引发革命。它在编程领域表现如何&#xff1f;先不说能否替代程序员&#xff0c;这个还有待更多的测试和反馈&#xff0c;我想先试试它能不能像教数学那样教编程。我找了个Jav…

Docker的可视化界面工具

Docker的可视化界面工具1. Portainer1.1 Introduction1.1.1 Official1.2 Download And Deploy1.3 Dashboard1.3.1 Dashboard2. Shipyard2.1 Introduction2.1.1 Character2.1.2 Official2.2 Download And Deploy2.2.1 脚本下载镜像2.2.2 执行脚本2.2.2 查看下载的镜像2.3 Dashbo…

“工作三年,跳槽要求涨薪50%”,合理吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f;回答最多的一定是&#xff1a;跳槽&#xff01;前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;”截图来源于知乎&#xff0c;如侵删…

【百面成神】多线程基础16问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;纯手打总结面试题&#xff0c;自用备用 &#x1f330; 文章简介&#xff1a;多线程最基础、重要的16道面试题 文章目…

【百面成神】Redis基础11问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;纯手打总结面试题&#xff0c;自用备用 &#x1f330; 文章简介&#xff1a;Redis最基础、重要的11道面试题 文章目录…

AI 未来已至,向量数据库站在新的节点上

“AI 的 iPhone 时刻已经到来。” 在刚刚结束的 NVIDIA GTC Keynote 中&#xff0c;这句话被 NVIDIA CEO 黄仁勋反复提及&#xff0c;长达 1 个多小时的分享中&#xff0c;生成式 AI 相关的内容占据了绝大部分比重。他表示&#xff0c;生成式 AI 的火热能力为企业带来了挑战&a…

2022/3/22 从CV方向角度 —快速解读Nvidia 2023GTC

GTC分享内容和个人看法 3月21号11点&#xff0c;Nvidia开启了GTC主题演讲&#xff0c;这些年英伟达加速库的发展和对AI的投入应用&#xff0c;不难看出掌握GPU加速计算技术的N家肯定是宣扬AI方向的产品和生产工具&#xff0c;下面我将简要汇总下演讲的内容&#xff0c;和从我自…

Java语言-----类与对象的秘密

目录 前言 一、类与对象的介绍 二、类的实例化 三.类与对象的使用方法 3.1对象的初始化 3.2内存显示图 四.this的使用方法 总结 &#x1f63d;个人主页&#xff1a; tq02的博客_CSDN博客-C语言,Java领域博主 &#x1f308;理想目标&#xff1a;努力学习&#xff0c;向Java进…

修改linux网卡配置文件的文件名

修改linux网卡配置文件的文件名 查看自己系统中网卡配置文件的文件名 #查看网卡的配置文件名&#xff0c;已经网络的状态 ip a查看系统是否可以使用ifconfig命令 #输入命令 ifconfig #出现以下图片表示ifconfig的命令可用。可能出现的错误&#xff1a;ifconfig command no foun…

第十七天 JavaScript、Vue详细总结

目录 JavaScript、Vue 1. JavaScript常用对象 1.1 Array对象 1.2 String对象 1.3 自定义对象 1.4 JSON 1.5 BOM 1.6 DOM 2. 事件监听 2.1 事件绑定 2.2 常见事件 2.3 案例 3. Vue 3.1 概述 3.2 快速入门 3.3 常用指令 3.4 生命周期 JavaScript、Vue 今日目标&…

为什么说网络安全是风口行业?是IT行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万&…

2023年2月用户体验GX评测:国有行及股份行持续领跑,农商行农信社积极探索用户体验提升

易观&#xff1a;2023年2月易观千帆用户体验GX评测显示&#xff0c;国有行及股份制银行继续领跑手机银行用户体验&#xff0c;平安口袋银行、中国工商银行、招商银行稳居AAAAA级&#xff1b;城商行、农商行、农信社重视用户体验&#xff0c;银行下一步重点依然是狠抓用户体验建…

【java基础】Stream流的各种操作

文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法flatMap方法limit和skip方法distinct方法sorted方法收集结果收集为数组&#xff08;toArray&#xff09;收集为集合&#xff08;collect&#xff09;收集为Map关于流的一些说明&#xff08;终结操…

WEB网站服务(一)

1.1 Apache网站服务基础1.1.1Apache简介Apache HTTP Server是开源软件项目的杰出代表&#xff0c;基于标准的HTTP网络协议提供网页浏览服务。Apache服务器可以运行在Linux,UNIX&#xff0c;windows等多种操作系统平台中。1.Apache的起源1995年&#xff0c;Apache服务程序的1.0版…

Linux- 系统随你玩之--玩出花活的命令浏览器-双生姐妹花

文章目录1、背景2、命令浏览器-双生姐妹花2.1、姐妹花简介2.2 、验名正身2.3、常用功能选项3、常用实操3.1、发送请求获取文件3.1.1、抓取页面内容到一个文件中3.1.2、多个文件下载3.1.3、下载ftp文件3.1.4、断点续传3.1.5、上传文件3.1.6、内容输出3.2 、利用curl测试接口3.3 …

毕业设计 基于51单片机自动智能浇花系统设计

基于51单片机自动智能浇花系统设计1、毕业设计选题原则说明&#xff08;重点&#xff09;2、项目资料2.1 系统框架2.2 系统功能3、部分电路设计3.1 STC89C52单片机最小系统电路设计3.2 按键电路设计3.3 水泵控制电路设计4、部分代码展示4.1 数码管位选程序4.2 ad0832数据读取程…

HTTPS协议,看这篇就够了

不安全的HTTP 近些年来&#xff0c;越来越多的网站使用 HTTPS 协议进行数据传输&#xff0c;原因在于 HTTPS 相较于 HTTP 能够提供更加安全的服务。 很多浏览器对于使用 HTTP 协议的网站会加上『警告』的标志表示数据传输不安全&#xff0c;而对于使用 HTTPS 协议的网站会加上…

C++11智能指针

目录 一、智能指针的初步认识 1.1 使用场景 1.2 原理 二、std::auto_ptr 2.1 管理权转移 2.2 auto_ptr的模拟实现 三、std::unique_ptr 四、std::shared_ptr 4.1 基础设计 4.2 线程安全问题 4.3 定制删除器 五、std::weak_ptr 六、C11与Boost中智能指针的关系 一、…

脱不下孔乙己的长衫,现代的年轻人该怎么办?

“如果我没读过书&#xff0c;我还可以做别的工作&#xff0c;可我偏偏读过书” “学历本该是我的敲门砖&#xff0c;却成了我脱不下的长衫。” 最近&#xff0c;“脱下孔乙己的长衫”在网上火了。在鲁迅的原著小说中&#xff0c;孔乙己属于知识阶级&#xff08;长衫客&#xf…