【Java 设计模式】23 种设计模式

文章目录

    • 设计模式是什么
    • 计算机行业里的设计模式
      • 创建型模式(共 5 种)
      • 结构型模式(共 7 种)
      • 行为型模式(共 11 种)
    • 总结

设计模式是什么

“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必重复劳动。”

----- Christopher Alexander

Alexander 是 20 世纪 70 年代的一位著名的建筑师 ,他为了解决同一个问题而设计出的不同版本的建筑结构,突然发现了这些高质量的设计中都具有着相似部分,然后他就把这些相似的部分提炼出来总结成了一套经验,留着后续再设计时使用。

计算机行业里的设计模式

设计模式是在软件设计中经常出现的问题的解决方案,它们是经验丰富的开发人员通过时间和实践总结出来的最佳实践。

✨说白一点

它就是一套经过前人踩坑之后,总结出来的一套被反反复复使用的解决方案,

也即,前人栽树,后人乘凉。

在 Java 中,我们有幸继承了许多经典的设计模式,其中最著名的是《设计模式:可复用面向对象软件的基础》一书中总结的 23 种设计模式。这些设计模式可以分为三大类:创建型模式、结构型模式和行为型模式,本文我们将简要概述一下这些设计模式。

在这里插入图片描述

创建型模式(共 5 种)

  1. 单例模式(Singleton Pattern)
    • 保证一个类仅有一个实例,并提供一个访问它的全局点
    • 示例:java.lang.Runtime、数据库连接池
  2. 工厂方法模式(Factory Method Pattern)
    • 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
    • 示例:java.util.Calendarjava.util.Collection
  3. 抽象工厂模式(Abstract Factory Pattern)
    • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
    • 示例:javax.xml.parsers.DocumentBuilderFactory
  4. 建造者模式(Builder Pattern)
    • 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
    • 示例:java.lang.StringBuilderjava.lang.StringBuffer
  5. 原型模式(Prototype Pattern)
    • 通过复制现有的对象来创建新对象,而不是从头开始创建
    • 示例:java.lang.Object#clone()

结构型模式(共 7 种)

  1. 适配器模式(Adapter Pattern)
    • 将一个类的接口转换成客户希望的另外一个接口
    • 示例:java.util.Arrays#asList()
  2. 桥接模式(Bridge Pattern)
    • 将抽象部分与它的实现部分分离,使它们都可以独立地变化
    • 示例:java.util.logging
  3. 组合模式(Composite Pattern)
    • 将对象以树形结构组合以表示“部分-整体”的层次结构
    • 示例:java.awt.Containerjavax.swing.JComponent
  4. 装饰器模式(Decorator Pattern)
    • 动态地给一个对象添加一些额外的职责
    • 示例:java.io.InputStream
  5. 外观模式(Facade Pattern)
    • 为子系统中的一组接口提供一个一致的界面
    • 示例:java.net.URLjavax.faces.webapp.FacesServlet
  6. 代理模式(Proxy Pattern)
    • 为其他对象提供一种代理以控制对这个对象的访问
    • 示例:java.lang.reflect.Proxyjava.rmi.*
  7. 享元模式(Flyweight Pattern)
    • 用共享的方式高效地支持大量小粒度对象。
    • 示例:java.lang.Integer#valueOf(int)java.lang.String#intern()

行为型模式(共 11 种)

  1. 观察者模式(Observer Pattern)
    • 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
    • 示例:java.util.Observerjava.util.Observable
  2. 策略模式(Strategy Pattern)
    • 定义一系列算法,将它们封装起来,并且使它们可以相互替换
    • 示例:java.util.Comparatorjava.util.Arrays#sort()
  3. 命令模式(Command Pattern)
    • 将请求封装成对象,使得可以用不同的请求对客户进行参数化
    • 示例:java.lang.Runnablejavax.swing.Action
  4. 状态模式(State Pattern)
    • 允许对象在其内部状态改变时改变它的行为
    • 示例:java.util.Iteratorjavax.faces.lifecycle.Lifecycle
  5. 责任链模式(Chain of Responsibility Pattern)
    • 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
    • 示例:java.util.logging.Logger#log()
  6. 访问者模式(Visitor Pattern)
    • 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
    • 示例:javax.lang.model.element.Elementjavax.lang.model.element.ElementVisitor
  7. 中介者模式(Mediator Pattern)
    • 用一个中介对象来封装一系列的对象交互
    • 示例:java.util.Timerjava.util.concurrent.Executor
  8. 备忘录模式(Memento Pattern)
    • 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
    • 示例:java.util.Date
  9. 迭代器模式(Iterator Pattern)
    • 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
    • 示例:java.util.Iteratorjava.util.Collection
  10. 模板方法模式(Template Method Pattern)
    • 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
    • 示例:java.util.AbstractListjava.util.AbstractMap
  11. 解释器模式(Interpreter Pattern)
    • 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子
    • 示例:java.util.regex.Patternjavax.el.ELResolver

总结

这些设计模式提供了在特定情境中解决问题的通用方法,每种设计模式都有其适用的场景和优缺点。使用它们可以提高代码的可读性、可维护性和可扩展性。当我们对它们充分的掌握了,也可以自己去创造模式。最后,就像是倚天屠龙记中张无忌学习太极功似的,化有形于无形,无招胜有招(即所有模式变无模式)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker打包介绍

最近在做一个开源项目,遇到开发者问各种问题,发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用,发现docker真是个好东东,基本解决了各种版本差异的问题,真正做到了一键部署使用。 先熟悉一下docker里…

c++学习:容器stack栈+queue+map(简易输入法)+deque

目录 stack 模板原型 头文件 模板的成员类型和成员对象和成员函数 栈类模板的容器对象 实例 queue 模板原型 头文件 模板的成员类型和成员对象和成员函数 队列类模板的容器对象 实例 map 模板原型 头文件 模板的成员类型和成员对象和成员函数 关联类模板的容器…

debian cups 打印机共享

apt update apt install -y cups localhost:631 add printer root 密码 添加打印机 然后在windows上设置 http://ip:631/printers/HP_LaserJet_1022

Vue3---安装路由

介绍 在Vue3项目中安装路由 示例 第一步:执行npm命令安装路由 npm install vue-router4第二步:在项目的src文件夹下创建router子文件夹 第三步:创建index.js和routes.js文件,以下为文件的代码 //通过vue-router插件实现模板…

Elementui Radio单选框取消选中

问题: 最近开发一个后台项目的时候用到了单选框,而客户的要求是默认选择一个选项,然后点击可以取消选中。不想自己在手写一个Radio组件,只能在elementui的单选框上修改一下下啦。 1. .native的作用 .native的作用是在给组件添加修…

Typecho 最新XC主题 去除域名授权全解密源码

Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题,首页支持六种主题样式,支持Pjax优化访问速度,多种单页,如友链、说说等。评论支持表情,自定义编辑器,支持其他样式功能。该主题功能性挺高&…

代码随想录算法训练营第二十五天 | 216.组合总和III、17.电话号码的字母组合

216.组合总和III 题目: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 思路&…

3D Surface Subdivision Methods 3D 曲面细分方法

文章目录 1 介绍2 细分法3 一个简单的例子:Catmull-Clark 细分4 Catmull-Clark 细化5 Refinement Host6 Geometry Policy7 四种细分方法8 示例:自定义细分方法9 实施历史 原文地址: https://doc.cgal.org/latest/Subdivision_method_3/index.html#Chapte…

美创科技葛宏彬:夯实安全基础,对医疗数据风险“逐个击破”

导读 解决医疗机构“临床业务数据合规流动”与“重要数据安全防护”两大难题。 2023年11月11日,在2023年南湖HIT论坛上,HIT专家网联合杭州美创科技股份有限公司(以下简称美创科技)发布《医疗数据安全风险分析及防范实践》白皮书…

小程序学习基础(页面加载)

打开首页&#xff0c;然后点击第一个按钮进去心得页面 进入心得页面以后 第一个模块是轮播图用的是swiper组件&#xff0c;然后就是四个按钮绑定点击事件&#xff0c;最后就是下拉刷新&#xff0c;下拉滚动&#xff0c;上拉加载。代码顺序wxml,js,wcss,json。 <!--pages/o…

Python——python编译器安装教程

1.前往python官网下载安装程序 python官网 python编译器安装程序下载网站 2.找到自己需要的版本&#xff0c;下载对应的安装程序&#xff0c;运行程序 打开安装包&#xff0c;切记要勾选add python 3.9 to PATH 可选择自动安装&#xff08;Install Now&#xff09;或点击自定义…

Intellij-idea 如何编译maven工程

在IntelliJ IDEA中编译Maven工程的过程如下所示&#xff1a; 打开IntelliJ IDEA并导入Maven工程。选择"File"&#xff08;文件&#xff09;菜单&#xff0c;然后选择"Open"&#xff08;打开&#xff09;或者"Open Project"&#xff08;打开项目…

JVM工作原理与实战(十):类加载器-Java类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、介绍 二、扩展类加载器 三、通过扩展类加载器去加载用户jar包 1.放入/jre/lib/ext下进行扩展 2.使用参数进行扩展 四、应用程序类加载器 总结 前言 ​JVM作为Java程序的运行…

WPF常用控件-Window

常用属性 这里重点记录一些关键且容易忘记的属性&#xff0c;那些很常用的如Title啥的就不在这里一一说明了。 任务栏按钮 ShowInTaskbar&#xff1a;是否在任务栏中显示应用按钮&#xff0c;默认为True。 层级 Topmost&#xff1a;应用是否始终在所有应用的最上层&#x…

MongoDB分片集群架构详解

分片简介 分片&#xff08;shard&#xff09;是指在将数据进行水平切分之后&#xff0c;将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于&#xff0c;MongoDB 本身就自带了分片管理的能力&#xff0c;对于开发…

Tensorflow2.0笔记 - 基本数据类型,数据类型转换

【TensorFlow2.0】(1) tensor数据类型&#xff0c;类型转换_tensorflow tensor转int-CSDN博客文章浏览阅读1.5w次&#xff0c;点赞8次&#xff0c;收藏28次。各位同学好&#xff0c;今天和大家分享一下TensorFlow2.0中的tensor数据类型&#xff0c;以及各种类型之间的相互转换方…

【OpenVINO 】在 MacOS 上编译 OpenVINO C++ 项目

前言 英特尔公司发行的模型部署工具OpenVINO™模型部署套件&#xff0c;可以实现在不同系统环境下运行&#xff0c;且发布的OpenVINO™ 2023最新版目前已经支持MacOS系统并同时支持在苹果M系列芯片上部署模型。在该项目中&#xff0c;我们将向大家展示如何在MacOS系统、M2芯片的…

③使用Redis缓存,并增强数据一致性。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 使用Redis缓存&#xff0c;并增强数据一致性。…

1. 认识SPSS

使用的是IBM SPSS statistics 25&#xff0c;参考教材《统计分析与SPSS的应用》 一、安装和启动 具体安装过程是参考spss下载以及安装详细教程这篇文章&#xff0c;下载安装包然后按他的步骤获取用户许可证即可。 二、主要窗口 数据编辑器窗口data editor 是SPSS的主程序窗…

UV映射技巧和窍门

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 有一个鲜为人知的主题是纹理映射。这始终是 3D 建模师想要处理的最后…