设计模式笔记(一)

目录

设计模式共有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.rhkb.cn/news/387795.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速开启react+electron应用,搭建启动问题

注意: React 本地启动在 3000端口Electron 在创建 BrowserWindow 的时候,可以读取本地的文件或者是 url开发环境 读取localhost: 3000生产环境 需要加载本地成型以后的本地文件,打包的时候再考虑 一 react 脚手架 create-react-app 快速搭建…

QT--聊天室

一、设计要求 用QT做一个聊天室, 制作一个服务器和客户端。可以进行注册、登录, 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录,也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…

IDEA管理远程仓库Git

1、模拟项目 新建一个文件夹,用来这次演示 用IDEA来打开文件夹 2、创建仓库 在IDEA中给该文件夹创建本地仓库和远程仓库 在菜单栏找到VCS选择Share project on Gitee 在弹窗中输入描述信息 接下来会出现以下弹窗 点击ADD后,在gitee上会创建远程仓库 …

嵌入式开发服务器与客户端交互 日志2024/7/31

嵌入式开发服务器与客户端交互 客户端 网页 操作 请求相关代码: 这里为了适配 低版本浏览器 用的不是fetch 当然用fetch更好 var curUlr window.location.href; //获取当前网页地址var newURL curUlr.lastIndexOf("/");//截取到最后一个斜杠索引var pathUrl…

mysql 数据库空间统计sql

mysql 数据库空间统计 文章目录 mysql 数据库空间统计说明一、数据库存储代码二、查询某个数据库的所有表的 代码三、列出所有已经产生碎片的表总结 说明 INFORMATION_SCHEMA Table Reference 表参考 information_schema是‌MySQL中的一个特殊数据库,它存储了关于…

MLP多层感知机与Pytorch实现

参考文章: 1.动手学深度学习——多层感知机(原理解释代码详解)_多层感知机 代码-CSDN博客 2.4.1. 多层感知机 — 动手学深度学习 2.0.0 documentation 3.深度理解多层感知机(MLP) | 米奇妙妙屋 1. 神经网络由来 神经网…

Scrapy 爬取旅游景点相关数据(七):利用指纹实现“不重复爬取”

本期学习: 利用网页指纹去重 众所周知,代理是要花钱的,那么在爬取(测试)巨量网页的时候,就不可能对已经爬取过的网站去重复的爬,这样会消耗大量的时间,更重要的是会消耗大量的IP (金…

vite instanceof 失效

背景:给一个巨石单体项目进行标准化模块拆分,封装出来的模块代码用 vite 进行构建,但模块启动后页面上的表现一直和 webpack 那版不一致 一步步 debug 后,发现问题出在下面这个判断条件 const GeneratorFunction function* () …

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

Vue 3 中使用 InMap 绘制热力图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 Vue 3 中使用 InMap 绘制热力图 应用场景介绍 InMap 是一款强大的地图组件库,它提供了一系列丰富的可视化功能,包括热力图。热力图可以将数据点在地图上以颜色编码的方式可视化&#x…

微软:警惕利用VMware ESXi进行身份验证绕过攻击

微软于7月29日发布警告,称勒索软件团伙正在积极利用 VMware ESXi 身份验证绕过漏洞进行攻击。 该漏洞被追踪为 CVE-2024-37085,由微软安全研究人员 Edan Zwick、Danielle Kuznets Nohi 和 Meitar Pinto 发现,并在 6 月 25 日发布的 ESXi 8.0 …

如何学习自动化测试工具!

要学习和掌握自动化测试工具的使用方法,可以按照以下步骤进行: 一、明确学习目标 首先,需要明确你想要学习哪种自动化测试工具。自动化测试工具种类繁多,包括但不限于Selenium、Appium、JMeter、Postman、Robot Framework等&…

docker环境安装kafka/Flink/clickhouse镜像

1、安装Kafka服务 1、将一下三个tar文件复制到ubuntu指定目录下 2、进入到/home/cl/app目录,使用docker命令加载tar镜像文件 # cd /home/cl/app # docker load -i kafka.tar # docker load -i kafka-manager.tar # docker load -i kafka-zookeeper.tar3、查看d…

分布式:RocketMQ/Kafka总结(附下载链接)

文章目录 下载链接思维导图 本文总结的是关于消息队列的常见知识总结。消息队列和分布式系统息息相关,因此这里就将消息队列放到分布式中一并进行处理关联 下载链接 链接: https://pan.baidu.com/s/1hRTh7rSesikisgRUO2GBpA?pwdutgp 提取码: utgp 思维导图

web学习笔记(八十三)git

目录 1.Git的基本概念 2.gitee常用的命令 3.解决两个人操作不同文件造成的冲突 4.解决两个人操作同一个文件造成的冲突 1.Git的基本概念 git是一种管理代码的方式,广泛用于软件开发和版本管理。我们通常使用gitee(码云)来云管理代码。 …

《Linux运维总结:基于x86_64架构CPU使用docker-compose一键离线部署zookeeper 3.8.4容器版分布式集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面对不同的客户部署业务系统&#xff0…

前端如何实现更换项目主题色的功能?

1、场景 有一个换主题色的功能,如下图: 切换颜色后,将对页面所有部分的色值进行重新设置,符合最新的主题色。 2、实现思路 因为色值比较灵活,可以任意选取,所以最好的实现方式是,根据设置的…

全面整理人工智能(AI)学习路线图及资源推荐

在人工智能(AI)飞速发展的今天,掌握AI技术已经成为了许多高校研究者和职场人士的必备技能。从深度学习到强化学习,从大模型训练到实际应用,AI技术的广度和深度不断拓展。作为一名AI学习者,面对浩瀚的知识海…

递归方法清空多维数组中的null元素(对象)

源码 //【递归】说明:递归方法清空多维数组中的null元素(对象) let clearNullElementsInArray (arr) > {return (arr || []).filter(v > {if (v null) {return false;} else {if (v.children) {v.children clearNullElementsInArra…

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…