一表总结 Java 的3种设计模式与6大设计原则

设计模式通常分为三大类:创建型、结构型和行为型。

  • 创建型模式:主要用于解决对象创建问题
  • 结构型模式:主要用于解决对象组合问题
  • 行为型模式:主要用于解决对象之间的交互问题

创建型模式

创建型模式关注于对象的创建机制,提供了创建对象的灵活性。以下是Java中的创建型设计模式:

类型具体名称特点
创建型单例模式确保一个类只有一个实例,并提供一个全局访问点。
创建型工厂方法模式定义一个接口用于创建对象,但由子类决定实例化哪个类。
创建型抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族。
创建型建造者模式使用多个简单的对象一步步构建一个复杂的对象。
创建型原型模式通过复制现有的实例来创建新的实例。

结构型模式

结构型模式关注于如何将类或对象组合成更大的结构。以下是Java中的结构型设计模式:

类型具体名称特点
结构型适配器模式将一个类的接口转换成客户端所期望的另一种接口。
结构型装饰器模式动态地给对象添加额外的职责。
结构型代理模式为其他对象提供一种代理以控制对这个对象的访问。
结构型组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。
结构型外观模式为子系统中的一组接口提供一个统一的高层接口。
结构型桥接模式将抽象部分与实现部分分离,使它们可以独立变化。
结构型享元模式通过共享对象来有效地支持大量细粒度的对象。

行为型模式

行为型模式关注于对象之间的通信、交互。以下是Java中的行为型设计模式:

类型具体名称特点
行为型观察者模式定义了一种一对多的依赖关系,状态改变时自动更新。
行为型策略模式定义了一系列算法,并将每一个算法封装起来。
行为型命令模式将请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化。
行为型状态模式允许一个对象在其内部状态改变时改变其行为。
行为型责任链模式将请求的发送者和接收者解耦,通过一系列处理对象来处理请求。
行为型备忘录模式捕获对象的内部状态,以便在未来恢复。
行为型迭代器模式提供一种方法顺序访问一个集合对象中的元素。
行为型访问者模式在不改变元素类的前提下定义作用于这些元素的新操作。
行为型中介者模式通过一个中介者对象来封装一系列的对象交互。
行为型解释器模式定义一种语言的文法表示,并定义一个解释器来处理该语言。
行为型过滤器模式允许通过一系列的处理对象来过滤请求。

六大设计原则

名称特点
单一职责原则(SRP)一个类应该只有一个引起它变化的原因。也就是说,一个类只应该有一个职责。
开放-关闭原则(OCP)软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即通过添加新代码扩展功能,而不是修改现有代码。
里氏替换原则(LSP)子类对象应该能够替换父类对象,程序的功能不受影响。即子类必须能够完全替代父类。
接口隔离原则(ISP)一个类对另一个类的依赖应该建立在最小的接口上。即客户端不应该依赖它不需要的接口。
依赖倒置原则(DIP)高层模块不应该依赖低层模块,二者都应该依赖抽象。即应该依赖于接口而不是具体实现。
合成复用原则(CRP)尽量使用组合/聚合的方式,而不是使用继承。即优先选择组合而不是继承来实现代码复用。

汇总表格

类型具体名称特点
创建型单例模式确保一个类只有一个实例,并提供一个全局访问点。
工厂方法模式定义一个接口用于创建对象,但由子类决定实例化哪个类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族。
建造者模式使用多个简单的对象一步步构建一个复杂的对象。
原型模式通过复制现有的实例来创建新的实例。
结构型适配器模式将一个类的接口转换成客户端所期望的另一种接口。
装饰器模式动态地给对象添加额外的职责。
代理模式为其他对象提供一种代理以控制对这个对象的访问。
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。
外观模式为子系统中的一组接口提供一个统一的高层接口。
桥接模式将抽象部分与实现部分分离,使它们可以独立变化。
享元模式通过共享对象来有效地支持大量细粒度的对象。
行为型观察者模式定义了一种一对多的依赖关系,状态改变时自动更新。
策略模式定义了一系列算法,并将每一个算法封装起来。
命令模式将请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化。
状态模式允许一个对象在其内部状态改变时改变其行为。
责任链模式将请求的发送者和接收者解耦,通过一系列处理对象来处理请求。
备忘录模式捕获对象的内部状态,以便在未来恢复。
迭代器模式提供一种方法顺序访问一个集合对象中的元素。
访问者模式在不改变元素类的前提下定义作用于这些元素的新操作。
中介者模式通过一个中介者对象来封装一系列的对象交互。
解释器模式定义一种语言的文法表示,并定义一个解释器来处理该语言。
过滤器模式允许通过一系列的处理对象来过滤请求。

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

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

相关文章

额外题目汇总2-链表

链表 1.24. 两两交换链表中的节点 力扣题目链接(opens new window) 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 思路 使用虚拟头结点会很方便&#xff…

pytest-xdist 进行多进程并发测试!

在软件开发过程中,测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加,测试用例的执行效率变得尤为重要。为了加速测试过程,特别是对于一些可以并行执行的测试用 例,pytest-xdist 提供了一种强大的工具&…

化学-基础知识一

文章目录 1、物质分类2、离子反应3、氧化还原反应4、物质的量5、电子排布式6、元素周期表 化学基础知识,物质分类、离子反应、氧化还原反应、物质的量、电子排布式、元素周期表 1、物质分类 物质广泛分为混合物和纯净物,纯净物是主要研究对象&#xff1b…

Pycharm调试Deepseek API

本文主要是使用pycharm工具测试调用DeepSeek API 1、deepseek官网注册账号 DeepSeek 2、创建API key(注意:复制保存好API key,因为出于安全原因,你将无法通过 API keys 管理界面再次查看它) 3、pycharm创建新项目和c…

Java使用aspose实现pdf转word

Java使用aspose实现pdf转word 一、下载aspose-pdf-21.6.jar包【下载地址】&#xff0c;存放目录结构如图&#xff1b;配置pom.xml。 <!--pdf to word--> <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId>…

检索式知识库问答相关研究调研

基于信息检索的知识库问答存在以下问题 一、问题解析阶段 复杂问题解析 1.问题中包括多个实体&#xff1a;(i)使用卷积操作捕获每个词的上下文特征&#xff1b;(ii)使用大语言模型对问题进行凝练&#xff0c;保留关键信息&#xff1b;(iii)采用思维链的方式对问题进行分解&am…

Python基于Django的课堂投票系统的设计与实现【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

C++ Primer 数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

CPU的基本结构

基本结构 控制器&#xff08;Control Unit&#xff09;&#xff1a;负责控制&#xff0c;如指令计数器&#xff0c;指令跳转。 算术逻辑控制器&#xff08;Arithmetic/Logic Unit&#xff09;&#xff1a;负责计算&#xff0c;如算术运算加减&#xff0c;逻辑比较大小等。 南北…

git SourceTree 使用

Source Tree 使用原理 文件的状态 创建仓库和提交 验证 再克隆的时候发发现一个问题&#xff0c;就是有一个 这个验证&#xff0c;起始很简单 就是 gitee 的账号和密码&#xff0c;但是要搞清楚的是账号不是名称&#xff0c;我之前一直再使用名称登录老是出问题 这个很简单的…

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索&#xff08;BFS&#xff09;是一种广泛应用于图论中的算法&#xff0c;常用于寻找最短路径、图的遍历等问题。与深度优先搜索&#xff08;DFS&…

hot100(9)

81.104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 后序遍历&#xff0c;从下往上&#xff0c;需要用到下面返回的结果。 public int maxDepth(TreeNode root) {if(root null){return 0;}int left maxDepth(root.left);int right maxDepth(root.right);re…

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…

U9成品入库单有提示 组织+单号已经存在

2025年首个问题出来了&#xff01;也是U9上线以来首次碰到的问题。看到这样的提示&#xff0c;头皮发麻了。深感不妙。看过all.log之后&#xff0c;果然是重复行的问题&#xff01; 怎么会有重复行的错误发生呢&#xff1f;百思不得其解。 无奈之下&#xff0c;只能将单据类型…

为什么要设计DTO类/什么时候设置DTO类?

为什么设计DTO类&#xff1f; 例如&#xff1a;根据新增员工接口设计对应的DTO 前端传递参数列表&#xff1a; 思考&#xff1a;是否可以使用对应的实体类来接收呢&#xff1f; 注意&#xff1a;前端提交的数据和实体类中对应的属性差别比较大&#xff0c;所以自定义DTO类。 …

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…

大语言模型遇上自动驾驶:AsyncDriver如何巧妙解决推理瓶颈?

导读 这篇论文提出了AsyncDriver框架&#xff0c;致力于解决大语言模型在自动驾驶领域应用中的关键挑战。论文的主要创新点在于提出了大语言模型和实时规划器的异步推理机制&#xff0c;实现了在保持性能的同时显著降低计算开销。通过设计场景关联指令特征提取模块和自适应注入…

【iOS自动化】Xcode配置WebDriverAgent

WebDriverAgent 是 iOS 端自动化测试的工具&#xff0c;这里记录下 MacOS 环境 Xcode 如何配置 WebDriverAgent。 【重要】环境准备 ‼️ 注意&#xff1a;Xcode 版本需要支持对应的 iOS 版本&#xff0c;而 Xcode 版本又依赖 MacOS 版本&#xff1b;在开始部署前&#xff0c…

洛谷题目: P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 (本题较简)

题目传送门&#xff1a; P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 这是一道关于概率和期望的动态规划问题&#xff0c;解题的核心思路是通过建立状态转移方程来计算甲壳虫从树根爬到树顶所需时间的期望值。题…

力扣题库第495题目解析

文章目录 1.题目再现2.思路分析&&示例说明2.1第一个示例2.2第二个示例 3.代码解释 1.题目再现 这个题目的名字叫做提莫攻击&#xff0c;如果是玩游戏的小伙伴对于这个场景就很熟悉了&#xff1b; 这个实际上是说&#xff1a;已知的条件会给我们一个数组&#xff0c;在…