【Java】六大设计原则和23种设计模式
目录
一、JAVA六大设计原则
二、JAVA23种设计模式
1. 创建型模式
2. 结构型模式
3. 行为型模式
三、设计原则与设计模式
1. 设计原则
2. 设计模式
四、单例模式
1. 饿汉式
2. 懒汉式
四、代理模式
1. 什么是代理模式
2. 为什么要用代理模式
3. 有哪几种代理模式
4. 静态代理
5. 动态代理(解决静态代理模式缺点)
五、静态工厂
一、JAVA六大设计原则
JAVA设计模式提供六个基本原则,分别是:
(1)开闭原则(OCP) - The Open-Closed Principle
(2)单一职责原则(SRP) - Single Responsibility Principle
(3)里氏替换原则(LSP) - Liskov Substitution Principle
(4)依赖倒置原则(DIP) - Dependency Inversion Principle
(5)接口隔离原则(ISP) - Interface Segregation Principle
(6)迪米特法则(DP) - Demeter Principle
二、JAVA23种设计模式
Java中的23种设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。
1. 创建型模式
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、生成器模式、原型模式。
2. 结构型模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3. 行为型模式
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
三、设计原则与设计模式
1. 设计原则
设计原则是为了更好的设计软件的高层指导方针。它不提供具体的实现方式也不会绑定任何一种编程语言。
最常用的原则是SOLID(SRP, OCP, LSP, ISP, DIP)原则。
2. 设计模式
设计模式对关于面向对象问题的具体解决方案.比如说,如果你想创建一个类而且它在任何时刻只会有一个对象,那么你就应该使用单例类模式。
设计模式是经过大量检测的安全的做法。
四、单例模式
java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例。
1. 饿汉式
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

2. 懒汉式
懒汉式不会立即实例化对象,而是在需要的时候才进行实例化,即调用getInstance()方法时才会创建实例。
懒汉式本身不是线程安全的,因为多个线程可能同时进入getInstance()方法并尝试实例化对象,这可能导致创建多个实例。为了解决这个问题,可以通过加锁机制来确保线程安全。


四、代理模式
代理====>中介隔离、方法增强(不改变原方法)
1. 什么是代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。
我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
2. 为什么要用代理模式
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
3. 有哪几种代理模式
我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
静态代理: 静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
动态代理: 动态代理是在程序运行时通过反射机制动态创建的。
动态代理分为:
基于接口的动态代理(jdk自带)
基于子类的动态代理(第三方cglib)
4. 静态代理
优点:
(1)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
(2)代理对象可以扩展目标对象的功能;
(3)代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度
缺点:
(1)在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
(2)增加了系统的复杂度;
创建Woman(女子)接口:

创建Woman实例(PanJinLian):
创建中介代理WangPo(媒婆)牵线 :

PanJinLian找中介WangPo牵线:
5. 动态代理(解决静态代理模式缺点)
(1)jdk自带



参数解释:
proxy: 指代我们所代理的那个真实对象。
method: 指代的是我们所要调用真实对象的某个方法的Method对象。
args: 指代的是调用真实对象某个方法时接受的参数。
Proxy这个类的作用就是用来动态创建一个代理对象的类
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载。
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了。
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上。
(2)第三方(cglib)
依赖:



五、静态工厂
概念:静态工厂是一种特殊的工厂模式,其特点是利用一个类的静态方法来创建并返回该类或其子类的实例。这种方式允许开发者通过静态方法的调用来获取对象,而无需直接使用构造函数。
应用场景:静态工厂方法常用于创建单例对象。通过私有化构造函数,仅通过静态工厂方法提供唯一的实例获取途径,可以实现对象的重复利用,避免不必要的对象创建开销。同时,静态工厂方法还可以用于根据不同条件创建不同类型的对象。例如,在解析配置文件或处理不同数据格式时,可以根据输入的类型动态地创建相应的处理对象。
例如:面条工厂生产多种面。






相关文章:
【Java】六大设计原则和23种设计模式
目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …...
Java IO流全面教程
此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象,指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…...
PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范
先附上我之前写的关于PCIe5.0金手指的设计解读: PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议(二)_gnd bar-CSDN博客 首先,相较于PCI…...
二、创建drf纯净项目
1)创建项目 django-admin startproject api2)创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…...
算法1:双指针思想的运用(2)--C++
1.盛水最多的容器 题目链接:11. 盛最多水的容器 - 力扣(LeetCode) 题目解析: 在解析题目时,我们可以把最直接的方法先列举出来,然后再根据相应的算法原理,来进行优化 思路一:暴力…...
L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数
L2.7 CPU调度策略 1、调度的策略 周转时间:任务进入到任务结束(后台任务更关注)响应时间:操作发生到响应时(前台任务更关注)吞吐量:CPU完成的任务量 响应时间小 -> 切换次数多 -> 系统…...
免费版U盘数据恢复软件大揭秘,拯救你的重要数据
我们的生活和工作越来越离不开各种存储设备,其中优盘因其小巧便携、方便使用的特点,成为了我们存储和传输数据的重要工具之一。为了防止你像我一样会遇到数据丢失抓狂的情况,我分享几款u盘数据恢复软件免费版工具来即时补救。 1.福昕U盘数据…...
Pikachu-Unsafe FileUpload-客户端check
上传图片,点击查看页面的源码, 可以看到页面的文件名校验是放在前端的;而且也没有发起网络请求; 所以,可以通过直接修改前端代码,删除 checkFileExt(this.value) 这部分; 又或者先把文件名改成…...
【数据结构】什么是红黑树(Red Black Tree)?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌红黑树的概念 📌红黑树的操作 🎏红黑树的插入操作 🎏红黑树的删除操作 结语 📌红黑树的概念 我们之前学过了…...
Xcode16适配
1.问题,第三方库报错信息如下: Declaration of sa_family_t must be imported from module Darwin.POSIX.sys.types._sa_family_t before it is required2.解答,在报错文件中导入以下头文件 #import <sys/_types/_sa_family_t.h>如有…...
Vue - 路由用法
前端路由就是URL中的hash与组件之间的对应关系。Vue Router是Vue的官方路由。 组成: VueRouter:路由器类,根据路由请求在路由视图中动态渲染选中的组件。<router-link>:请求链接组件,浏览器会解析成<a>。…...
SpringBoot框架下校园资料库的构建与优化
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
vscode 连接云服务器(ubantu 20.04)
更改服务器系统 如果云服务器上的系统不是ubantu20.04的,可以进行更改: 登录云服务官网(这里以阿里云为例)点击控制台 点击服务器实例 点击更多操作、重置系统 点击重置为其他镜像、系统镜像:选择你要使用的系统镜像…...
【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】
🌲 Redis 简介 🌾 什么是Redis Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 Redis是互联网技术领域使用最为广泛的存储中间件,它是「Remote DictionaryServic…...
排序算法之——归并排序,计数排序
文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1)递归版本2)非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结(排序算法稳定性&am…...
Linux中环境变量
基本概念 环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。 我们在编写C、C代码时候,在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器…...
163页PPT罗兰贝格品牌战略升级:华为案例启示与电器集团转型之路
罗兰贝格作为一家全球顶级的战略管理咨询公司,其品牌战略升级理念在多个行业中得到了广泛应用。以下将以华为案例为启示,探讨电器集团的转型之路,并融入罗兰贝格品牌战略升级的思想。 一、华为案例的启示 华为与罗兰贝格联合撰写的《数据存…...
系统设计,如何设计一个秒杀功能
需要解决的问题 瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法 前端设计 利用 CDN 缓存静态资源,减轻服务器的压力在前端随机限流按钮防抖,防止用户重复点击 后端设计 Nginx 做统一接入,进行负载均衡与限流用 sentinel 等…...
Linux:进程入门(进程与程序的区别,进程的标识符,fork函数创建多进程)
往期文章:《Linux:深入了解冯诺依曼结构与操作系统》 Linux:深入理解冯诺依曼结构与操作系统-CSDN博客 目录 1. 概念 2. 描述进程 3. 深入理解进程的本质 4. 进程PID 4.1 指令获取PID 4.2 geipid函数获取PID 4.3 kill指令终止进程 …...
索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验
在音乐的世界里,每一次技术的突破都意味着全新的听觉体验。 索尼,作为音频技术的先锋,再次以其最新力作——MDR-M1封闭式监听耳机,引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能,为音乐爱好者和专…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
