一文总结Java的23种设计模式

Java 设计模式是 Java 编程中常用的一些解决问题的模板,它们代表了最佳的实践和经验。设计模式可以帮助我们编写可复用、可维护和可扩展的代码。根据《设计模式:可复用面向对象软件的基础》一书,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。本文将对 Java 中的 23 种设计模式进行总结和概述。
一、创建型模式
创建型模式主要关注对象的创建过程,目的是在不直接使用 new 运算符的情况下创建对象,增加程序的灵活性和可扩展性。

  1. 单例模式(Singleton Pattern)
    单例模式确保一个类只有一个实例,并提供一个全局访问点。
  2. 工厂方法模式(Factory Method Pattern)
    工厂方法模式定义一个接口用于创建对象,但由子类决定要实例化哪一个类。
  3. 抽象工厂模式(Abstract Factory Pattern)
    抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  4. 建造者模式(Builder Pattern)
    建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
  5. 原型模式(Prototype Pattern)
    原型模式通过复制现有的实例来创建新的实例,而不是通过构造函数创建。
    二、结构型模式
    结构型模式主要关注类和对象的组合,目的是通过组合类和对象来形成更大的结构。
  6. 适配器模式(Adapter Pattern)
    适配器模式允许不兼容接口的类一起工作,通过包装不兼容接口的对象。
  7. 桥接模式(Bridge Pattern)
    桥接模式将抽象与实现分离,以便两者可以独立变化。
  8. 组合模式(Composite Pattern)
    组合模式用于将对象组合成树形结构以表示部分-整体的层次结构。
  9. 装饰器模式(Decorator Pattern)
    装饰器模式动态地给一个对象添加一些额外的职责,而不改变其接口。
  10. 门面模式(Facade Pattern)
    门面模式提供了一个统一的接口来访问一组接口,隐藏了系统的复杂性。
  11. 享元模式(Flyweight Pattern)
    享元模式通过共享尽可能多的相似对象来最小化内存使用。
  12. 代理模式(Proxy Pattern)
    代理模式为其他对象提供一种代理以控制对这个对象的访问。
    三、行为型模式
    行为型模式主要关注对象之间的通信,目的是通过对象之间的不同职责和算法来简化对象之间的通信。
  13. 职责链模式(Chain of Responsibility Pattern)
    职责链模式避免将请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。
  14. 命令模式(Command Pattern)
    命令模式将请求封装为一个对象,从而使用户和处理请求的对象解耦。
  15. 解释器模式(Interpreter Pattern)
    解释器模式为语言创建解释器,用来解释该语言中的句子。
  16. 迭代器模式(Iterator Pattern)
    迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而不暴露其内部的表示。
  17. 中介者模式(Mediator Pattern)
    中介者模式定义一个对象来封装一组对象之间的交互,使它们不需要显式地相互引用。
  18. 备忘录模式(Memento Pattern)
    备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  19. 观察者模式(Observer Pattern)
    观察者模式定义对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会得到通知并自动更新。
  20. 状态模式(State Pattern)
    状态模式允许一个对象在其内部状态改变时改变它的行为。
  21. 策略模式(Strategy Pattern)
    策略模式定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。
  22. 模板方法模式(Template Method Pattern)
    模板方法模式在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中实现。
  23. 访问者模式(Visitor Pattern)
    访问者模式表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    四、总结
    设计模式是 Java 编程中不可或缺的一部分,它们可以帮助我们编写更清晰、更可维护的代码。掌握这些设计模式不仅可以提高我们的编程水平,还可以让我们更好地理解和解决复杂的问题。在实际开发中,我们需要根据具体的需求和场景选择合适的设计模式,以达到最佳的设计效果。

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

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

相关文章

js对表格table行排序

function sortTable(type) {// 获取所有行并按第1列进行排序var sortedRows $(#myTbody tr).sort(function (a, b) {// 获取需要排序的列的值,可能是数字或者字符,这个根据自己的需要var indexa Number.parseInt($(a).find(td:eq(0)).text());var inde…

fetch和axios的区别

概念不同 Fetch是一种新的获取资源的接口方式,可以直接使用Axios是一个基于XMLHttpRequest封装的工具包,需要引入才可以使用 传递数据的方式不同 Fetch则是需要放在body属性中,以字符串的方式进行传递Axios是放到data属性里,以对象…

STM32F407移植OpenHarmony笔记6

继上一篇笔记,编译好STM32的裸机程序,能点亮LED灯了。 下一步就是启动liteos_m内核了。 不过为了更好的调试代码,需要先把printf重定向到串口,基于gcc的printf重定向和Keil不一样。 直接新建printf.c,在里面重写printf…

笔记本从零安装ubuntu server系统+环境配置

文章目录 前言相关链接ubuntu Server 安装教程屏幕自动息屏关上盖子不休眠MobaXterm外网SSH内网穿透IPV6远程 为什么我要笔记本装Linux为什么要换ubuntu Server版能否连接wifi之后Linux 配置清单总结 前言 之前装了个ubuntu desktop 版,发现没有命令行,…

呼吸灯--FPGA

目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮,再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是,首先灯是在第一个时钟周期保持高电平熄灭状态,在第二个时钟周期保持1/1…

RabbitMQ入门概念

目录 一、RabbitMQ入门 1.1 rabbitmq是啥? 1.2 应用场景 1.3 AMQP协议与RabbitMQ工作流程 1.4 Docker安装部署RabbitMQ 二、SpringBoot连接MQ配置 2.1 示例1 2.1 示例2 —— 发送实体 一、RabbitMQ入门 1.1 rabbitmq是啥? MQ(Message…

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分,在某些时候需要对字段进行编号,这里为大家介绍一下字段编号相关的代码,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据,除了POI数据,常见的GIS数据都可…

springboot中pom依赖包

官网 Maven Repository: Search/Browse/Explore

C语言第十四弹---函数递归

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么? 1.1、递归的思想: 1.2、递归的限制条件 2、递归举例 2.1、举例1:求n的阶乘 2.1.1、分析和代码…

HarmonyOS--组件转场动画

ArkUI在HarmonyOS中提供了组件转场动画功能,用于在页面间切换或容器内组件插入/删除时提供流畅且有吸引力的过渡效果。组件转场动画主要分为以下几种类型: 页面间转场动画: 页面之间的转场可以通过设置系统提供的或者自定义的转场动画实现。例…

Transformer 代码补充

本文是对Transformer - Attention is all you need 论文阅读-CSDN博客以及【李宏毅机器学习】Transformer 内容补充-CSDN博客的补充,是对相关代码的理解。 先说个题外话,在之前李宏毅老师的课程中提到multi-head attention是把得到的qkv分别乘上不同的矩…

【Java】Lombok的使用

一、Lombok是什么? Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量🚀 在我们封装一个类时,最常用…

CUDA编程- - GPU线程的理解 thread,block,grid - 学习记录

GPU线程的理解 thread,block,grid 一、从 cpu 多线程角度理解 gpu 多线程1、cpu 多线程并行加速2、gpu多线程并行加速2.1、cpu 线程与 gpu 线程的理解(核函数)2.1.1 、第一步:编写核函数2.1.2、第二步:调用核函数(使用…

809. 情感丰富的文字

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 有时候人们会用重复写一些字母来表示额外的感受,比如 "hello" -> …

网络代理用途

网络代理的用途广泛,常用于代理爬虫,代理VPN ,代理注入等。使用网络 代理能够将入侵痕迹进一步减少,能够突破自身IP的访问限制,提高访问速度, 以及隐藏真实IP ,还能起到一定的防止攻击的作用。下…

ROS方向第二次汇报(2)

文章目录 1.本方向内学习内容:1.1.动作:1.1.1.案例接口定义:1.1.2.案例通信模型:1.1.3.服务器端代码:1.1.4.客户端源代码:1.1.5.动作命令行操作: 1.2.参数:1.2.1.查看参数列表:1.2.2…

dvwa靶场xss储存型

xss储存型 xxs储存型lowmessage框插入恶意代码name栏插入恶意代码 medium绕过方法 high xxs储存型 攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。产生层面:后端漏洞特征:持久性的、前端执行、储存在后端数据…

4JS表达式和运算符expression and operator

表达式(expression)JavaScript中的一个短语,JavaScript解释器会将其计算(evaluate)出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式,它的值就是赋值给变量的值。复杂表达式是由…

童话修仙生成器

童话修仙生成器 查看代码生成代码查看代码 import pandas as pd data=pd.read_pickle("gen_story_data.pandas_pickle") print()生成代码 from tqdm import tqdm from zhipuai import ZhipuAI

类与对象(中篇)

1、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 2、构造函数---初始…