设计模式笔记(一)

目录

设计模式共有23种,也可称为GOF23

单例模式(重点,常用)

工厂模式

代理模式:(SpringAOP的底层原理)

静态代理模式:(写死一个代理类Proxy)

动态代理模式(基于接口:jdk动态代理;基于类:cglib动态代理):


Java设计模式是一套在Java程序设计中经过反复使用、多数人知晓的、代码设计经验的总结。它提供了一种框架和结构,旨在帮助开发者更好地理解和设计复杂的系统。设计模式不仅仅是一种语法规则,更是一种思想和方法论,能够帮助开发者更好地分析、设计和实现软件系统,确保代码的重用性、可维护性和可扩展性。这些模式通常被分为创建型模式、结构型模式和行为型模式,每种模式都针对特定的设计问题提供了标准的解决方案。

设计模式共有23种,也可称为GOF23

 下面我分次来介绍几种常见的设计模式:

单例模式(重点,常用)

饿汉式:(一上来就把对象加载啦,可能会浪费内存空间)

大致包括:私有的构造器;static final 且 私有 的new对象; public的访问器 返回对象;

(new对象时的static是因为静态方法里只能调用静态属性,final修饰类属性是防止二次改变指向)

懒汉式:(用的时候才加载对象)

(懒汉式有很多 :多线程不安全的懒汉式,多线程安全的懒汉式(性能不够高),双重检测锁的懒汉式(多线程安全+高性能))

双重检测锁懒汉式:

私有构造器; volatile锁防止指令重排序 保证原子性操作;双重检验锁 ,保证高性能

多线程、高并发场景下更加安全

 详细解析:

public class Singleton {  private volatile static Singleton singleton;  //私有属性无法直接读到,//这个volatile防止指令重排序,第一个线程创建成功但是未完全转为非空,第六个以后的线程会进入第一个if语句,会很麻烦private Singleton (){}  //构造方法私有  是防止new新对象//每个线程通过这个公有方法来获取对象,相当于一个访问器public static Singleton getSingleton() { //这里必须是静态方法,防止能new出来对象(与单例模式相矛盾)//静态方法中操作变量也必须是静态的(故上面的唯一变量对象是静态的),否则不能在这个静态方法中调用它//(因为静态方法里面无法操作全局的非静态变量)if (singleton == null) { //第一次假设5个线程通过了这条if语句,当这5个执行完之后,6、7、8个再进来时会被这个if语句拦截,直接return最初创建的新对象//多线程调用的情况下,如果是空的话,先锁起来,只允许一个线程创建对象,否则多线程同时拷贝调用这个方法,就创建了多个对象synchronized (Singleton.class) {  //多线程竞争这个锁,进来的只有一个,其余竞争失败线程进入阻塞队列if (singleton == null) { //第一个线程创建完对象后,singleton 不为空,第一个阻塞队列中的线程(假设2、3、4、5线程)再进来时被这条if语句拦截,故不能再次创建,此时可以直接return一个对象(第一个线程创建的)singleton = new Singleton();  }   // 进来的第一个线程成功创建了对象,然后执行完毕释放锁;原阻塞队列的其他线程再来竞争第一个锁}  }  return singleton;  }  
}

工厂模式

作用:创建者和调用者分离

核心本质:

  • 实例化对象不使用new,用工厂方法代替
  • 将选择实现类,创建对象的统一管理和控制。从而将调用者跟我们的实现类解耦。

常见工厂模式:

简单工厂模式

使用一个单独的工厂类来创建不同的对象,根据传入的参数判断创建哪种类型的对象。

工厂方法模式:每个人都有自己的工厂(工厂类变多)

定义了一个创建对象的(工厂)接口,但由子类决定实例化哪个类(需要哪个就实例化哪个实现类)。

代理模式:(SpringAOP的底层原理)

静态代理模式:(写死一个代理类Proxy)

最终还是要new一个固定的代理类,直接面向代理类来操作

动态代理模式(基于接口:jdk动态代理;基于类:cglib动态代理):

可以动态生成代理类,不把代理类写死,只写一个代理角色(动态生成代理类)

大致过程:

首先有原接口userService和原接口实现类userServiceImpl;

然后有一个类(实现InvocationHandler接口)可以自动生成代理类。在这个类里面:

1、加上被代理的接口,并实现set方法

2、新建一个方法体 return一个 Proxy.newProxyInstance(三个参数);

三个参数分别为:类加载,代理的哪个接口,this(InvocationHandler的实现类)

这个方法体的作用:得到代理类

3、实现InvocationHandler接口的invoke方法,处理代理的实例,并返回结果(这里是反射的知识)三个参数:调用方法的对象实例,要调用的方法的名称,实际传递给方法的参数值

再来一个类:

new一个真实的最原来的类,例:userServiceImpl

new一个代理角色(上一步创建的那个类)假设名字为pih

pih.set方法(要代理的对象,传入的是接口)

pih.getProxy();动态生成代理类,用proxy来接收

proxy.query(); 用代理类来调用原来类(userServiceImpl)的方法

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ansible基础讲解和加密文件讲解

ansible最重要的三个文件 /etc/ansible/ansible.cfg #####ansible的配置文件 /etc/ansible/host ##清单文件inventory ansible-navigator.yml ####以yml结尾的文件可以理解为conf结尾的文件,是配置文件,用于设置剧本playbook playbook讲解 以.yml结…

Superset二次开发之筛选器native Filters 水平布局

引言 Apache Superset作为一个功能强大的开源数据探索和可视化平台,提供了丰富的配置选项来定制化用户体验。其中,HORIZONTAL_FILTER_BAR 是一个重要的配置项,专注于优化和改进Superset中的筛选器条布局与交互。 什么是HORIZONTAL_FILTER_B…

IEC104转MQTT网关支持MQTT对接Ignition、阿里云、华为云、亚马逊AWS、ThingsBoard、Zabbix平台助力远程管理

钡铼推出了一款专为电力系统设计的数据采集网关——IEC104转MQTT网关BE113,感兴趣的朋友接着往下看: 一、网关概述 IEC104转MQTT(Ignition)网关BE113是一款专为电力系统设计的数据采集网关,支持DL/T645和IEC104等协议的设备。上行支持MQTT协…

LLama 405B 技术报告解读

LLama 405B 技术报告解读 果然传的消息都是真的,meta在24号凌晨发布了llama 3的405B版本,这次还是做一个技术报告解读。 值得一提的是,在技术报告的开头,meta特意强调了一个 Managing complexity,大意是管控复杂度。…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的,因此你可以根据需要测量的距离,自定义深度相机安装基线,并根据你的项目要求(分辨率、快门类型、FPS、光学元件&#xff…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外,还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相,成为赛场上另一道亮丽的风景线。 在新时代的浪潮中,中国制造业坚…

提交高通量测序处理数据到 GEO --- 操作流程

❝ 写在前面 由于最近在提交课题数据到 NCBI 数据库,整理了相关笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. 提交高通量测序数据到 GEO --- 说明书 2. 提交高通量测序原…

tcache attack

Tcache Attack tcache让堆利用更加简单: tcache回顾: 在 tcache 中新增了两个结构体,分别是 tcache_entry 和 tcache_perthread_struct: /* We overlay this structure on the user-data portion of a chunk when the chunk is …

如何安全的申请SSL证书

随着数字化时代的快速发展,互联网政务应用已成为政府服务民众、提升治理效能的重要途径。在这个网络日益复杂的时代,政务网站的安全问题显得尤为重要。2024年,国家出台并从2024年7月1日开始实施执行《互联网政务应用安全管理规定》&#xff0…

使用 XRDP 远程linux主机

一、简介 XRDP是一个开源的远程桌面协议(Remote Desktop Protocol,RDP)服务器,采用的是标准的RDP。 官网地址:https://www.xrdp.org/ github地址: https://github.com/neutrinolabs/xrdp/releases XRDP也是C/S架构&…

LLM及GPT知识点

工欲善其事必先利其器,在了解大语言模型和GPT之前先要了解基本概念。 LLM Large Language Model (LLM) 即大型语言模型,也叫大语言模型,是一种基于深度学习的自然语言处理(NLP)模型,它能够学习自然语言的语…

汇昌联信科技拼多多怎么样?

汇昌联信科技拼多多怎么样?汇昌联信科技是一家专注于提供电子商务解决方案的公司,其业务涉及多个电商平台,其中就包括了国内知名的电商平台——拼多多。对于汇昌联信科技在拼多多上的表现,我们可以从以下几个方面来进行深入的探讨和分析。 一…

网站用HTTP访问的危害以及如何升级HTTPS访问

在互联网世界中,数据传输的安全性是至关重要的。我们每天都在网络上进行各种操作,从浏览网页、购物到银行转账,每一项活动都涉及敏感信息的传递。然而,在这个过程中,我们的数据可能面临被窃取、篡改或滥用的风险。这正…

git实践汇总【配置+日常使用+问题解决】

**最初配置步骤:** git config --global user.name "yournemae" git config --global user.email "yourmail" git config -l ssh-keygen -t rsa -C “xxx.xxxx.EXTcccc.com” git config --global ssh.variant ssh $ git clone git仓库路径 git…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX?****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战:创建一个动态表单****8. AJAX中的事…

PostgreSQL性能优化之体系结构

本文介绍 PostgreSQL 数据库的体系结构,包括实例结构(进程与内存)、存储结构(物理与逻辑)以及插件式存储引擎。 实例与数据库聚簇 PostgreSQL 使用典型的客户端/服务器(Client/Server)架构&am…

JVM调优与监控命令概览

JVM调优与监控命令概览 1. jps - JVM Process Status Tool2. jstat - JVM Statistics Monitoring Tool3. jmap - JVM Memory Map Tool4. jhat - JVM Heap Analysis Tool5. jstack - Stack Trace for Java Threads6. jinfo - JVM Configuration Information 💖The B…

厚积薄发,详解 IoTeX 2.0 如何推动 DePIN 赛道迈向新台阶

背 景 DePIN 是加密货币行业的一个新兴垂直领域,也是本轮牛市最重要的叙事之一。DePIN 通常通过发行和分配代币来激励参与者,用户可以通过提供资源、维护网络、参与治理等方式获得代币奖励并产生直接的经济收益,从而重新洗牌财富分配方…

安卓嘀嗒清单v7.2.2.2高级版

软件介绍 TickTick是一款轻便高效的任务管理、日程管理(GTD)和时间管理应用,配备强大的记事和提醒功能。你可以在手机、平板、网页等多达11个平台上使用滴答清单记录大小事务、制定工作计划、整理购物清单、设置生日提醒,甚至安排…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统,和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…