91、23种设计模式

设计模式是软件设计中反复出现的解决方案的模板,用于解决特定问题并提高代码的可维护性、可扩展性和可复用性。23种经典设计模式可分为创建型、结构型和行为型三大类,以下是具体分类及模式概述:

一、创建型模式(5种)

关注对象的创建过程,解耦对象的实例化与使用,提高灵活性。

1.单例模式

  • 定义:确保一个类只有一个实例,并提供全局访问点。
  • 应用场景:配置管理、线程池、数据库连接池等。
  • 实现方式:饿汉式、懒汉式、双重检查锁、静态内部类等。

2.抽象工厂模式

  • 定义:创建一系列相关或依赖对象的家族,无需指定具体类。
  • 应用场景:跨平台UI组件库、数据库访问层等。
  • 优点:隔离具体类的生成,客户端与具体产品解耦。

3.工厂方法模式

  • 定义:定义一个创建对象的接口,由子类决定实例化哪个类。
  • 应用场景:JDBC连接数据库、日志记录器等。
  • 优点:符合开闭原则,新增产品无需修改原有代码。

4.建造者模式

  • 定义:分步骤构建复杂对象,允许相同的构建过程创建不同表示。
  • 应用场景:SQL构建器、JSON解析器等。
  • 优点:封装构建逻辑,便于扩展和复用。

5.原型模式

  • 定义:通过复制现有对象创建新对象,避免重复初始化。
  • 应用场景:对象创建成本高(如数据库连接)、缓存系统等。
  • 实现方式:浅拷贝(Object.clone())或深拷贝(序列化/反序列化)。

二、结构型模式(7种)

关注类或对象的组合,形成更大的结构,提高灵活性和可扩展性。

1.桥接模式

  • 定义:将抽象部分与实现部分分离,使它们可以独立变化。
  • 应用场景:跨平台图表库、驱动框架等。
  • 优点:避免继承导致的类爆炸,提高扩展性。

2.代理模式

  • 定义:为其他对象提供代理以控制访问。
  • 应用场景:RPC调用、AOP编程等。
  • 类型:静态代理、动态代理(JDK/CGLIB)。

3.组合模式

  • 定义:将对象组合成树形结构,表示“部分-整体”层次。
  • 应用场景:文件系统、GUI组件树等。
  • 优点:统一处理单个对象和组合对象。

4.适配器模式

  • 定义:将不兼容的接口转换为客户端期望的接口。
  • 应用场景:旧系统改造、第三方库集成等。
  • 类型:类适配器(继承)、对象适配器(组合)。

5.享元模式

  • 定义:共享大量细粒度对象,减少内存占用。
  • 应用场景:字符串常量池、线程池等。
  • 核心:区分内部状态(共享)和外部状态(独立)。

6.装饰器模式

  • 定义:动态添加职责到对象,比继承更灵活。
  • 应用场景:Java I/O流、日志装饰器等。
  • 优点:避免子类膨胀,功能扩展开放。

7.外观模式

  • 定义:为复杂子系统提供简化接口。
  • 应用场景:分布式系统、家庭影院控制等。
  • 优点:降低客户端与子系统的耦合度。

三、行为型模式(11种)

关注对象间的通信和职责分配,提高灵活性和可维护性。

1.访问者模式

  • 定义:将操作作用于对象结构中的元素,支持新操作扩展。
  • 应用场景:编译器语法树分析、XML解析等。
  • 缺点:增加对象结构时需修改所有访问者。

2.策略模式

  • 定义:定义算法族,封装并使其可互换。
  • 应用场景:排序算法、支付方式选择等。
  • 优点:避免条件语句,便于扩展新算法。

3.备忘录模式

  • 定义:捕获并保存对象状态,以便后续恢复。
  • 应用场景:游戏存档、文本编辑器撤销操作等。
  • 核心:备忘录对象(存储状态)、原发器(被保存对象)、管理者(管理备忘录)。

4.观察者模式

  • 定义:定义一对多依赖,主题状态变化时通知观察者。
  • 应用场景:事件处理、消息订阅等。
  • 实现方式:Java中的Observer接口或自定义事件总线。

5.模板方法模式

  • 定义:定义算法骨架,将步骤延迟到子类实现。
  • 应用场景:框架设计、单元测试框架等。
  • 核心:抽象类定义模板方法,子类实现具体步骤。

6.迭代器模式

  • 定义:提供顺序访问聚合对象元素的方法,不暴露内部结构。
  • 应用场景:集合遍历、树形结构遍历等。
  • 优点:统一访问接口,支持不同遍历方式。

7.状态模式

  • 定义:允许对象在内部状态改变时改变行为。
  • 应用场景:订单状态机、游戏角色状态等。
  • 优点:避免大量条件语句,符合开闭原则。

8.命令模式

  • 定义:将请求封装为对象,支持参数化、队列和日志。
  • 应用场景:事务管理、撤销操作等。
  • 优点:将操作与接收者解耦。

9.中介者模式

  • 定义:用中介对象封装对象间交互,减少耦合。
  • 应用场景:聊天室、GUI组件交互等。
  • 优点:避免对象间直接引用,降低复杂度。

10.解释器模式

  • 定义:定义语言的文法表示,并解释执行。
  • 应用场景:SQL解析、正则表达式等。
  • 缺点:复杂语言解析效率低。

11.责任链模式

  • 定义:将请求沿处理链传递,直到有对象处理它。
  • 应用场景:Web请求处理、审批流程等。
  • 优点:解耦请求发送者和接收者。

速记口诀

  • 单抽工建原。
  • 桥代理组装适配器,享元回家装饰外观。
  • 访问者写好策略备忘录,观察模板迭代的状态,命令中介解释责任链。

在这里插入图片描述

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

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

相关文章

力扣(串联所有单词的子串)

串联所有单词的子串问题:多滑动窗口与哈希表的实战应用。 一、题目分析(一)问题定义 给定字符串 s 和字符串数组 words(words 中所有单词长度相同 ),找出 s 中所有“串联子串”的起始索引。串联子串指包含 …

RH134 管理基本存储知识点

1. 对 Linux 磁盘进行分区时有哪两种方案?分别加以详细说明。答:MBR分区:主引导记录(MBR)分区方案是运行BIOS固件的系统上的标准方案。此方案支持最 多四个主分区。在Linux系统上,您可以使用扩展分区和逻辑分区来创建最多…

【JS 异步】告别回调地狱:Async/Await 和 Promise 的优雅实践与错误处理

【JS 异步】告别回调地狱:Async/Await 和 Promise 的优雅实践与错误处理 所属专栏: 《前端小技巧集合:让你的代码更优雅高效 上一篇: 【JS 数组】数组操作的“瑞士军刀”:精通 Array.reduce() 的骚操作 作者&#xff…

23.Linux : ftp服务及配置详解

Linux : ftp服务及配置详解 FTP 基本概念 定义:文件传输协议(File Transfer Protocol),采用 C/S 模式工作。端口: 控制端口:21数据端口:20FTP 工作原理模式工作流程连接发起方主动模…

悲观锁乐观锁与事务注解在项目实战中的应用场景及详细解析

在今天做的项目练习部分中真的学到了很多东西,也补充了许多之前遗漏或是忘记的知识点,但时间精力有限,我就先记录一下今天用到的一个新东西,悲观锁和乐观锁。首先给出实际应用背景:在加入锁和事务注解之前,…

Java构造器与工厂模式(静态工程方法)详解

1. 构造器1.1 构造器的核心意义1.1.1 对象初始化构造器在创建对象 (new) 时自动调用, 用于初始化对象的状态 (如设置字段初始值, 分配资源等)无构造器时: 字段为默认值(0/null/false)有构造器:确保对象创建后即处于有效状态1.1.2 强制初始化…

解决jdk初始化运行,防火墙通信选错专业网络问题

问题描述新项目添加不同版本的jdk,运行时提示防火墙通信策略,选成专用网络。其他人访问后端接口时,提示连接失败。 解决方案:1、在搜索栏中输入 防火墙关键字,选择到防火墙和网络保护2、选择允许应用通过防火墙3、先点…

【Linux】常用命令(三)

【Linux】常用命令(三)1. export1.1 原理1.2 常用语法1.3 示例1.4 书中对命令的解释1.5 生效范围2. 测试服务地址与其端口能否访问2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (适用于HTTP/HTTPS 服务)1. export export 是 Linux Shell&#xff…

Pytest项目_day15(yaml)

YAMLYAML是一个对所有编程语言都很友好的数据序列化标准,它是一种直观的能够被电脑识别的数据序列化格式,是一种可读性高且容易被人类阅读的脚本语言YAML语言的本质是一种通用的数据串行化格式适用场景 可以直接序列化为数组、字典解析成本低专门写配置文…

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案 本文基于实际企业级审批系统源码,深入解析如何设计高扩展性、强一致性的审批流程引擎,涵盖状态机设计、多租户隔离、文件服务集成等核心实现。 1. 系统设计概览 审批系统的核心架…

汽车免拆诊断案例 | 2010款奥迪A4L车行驶中发动机偶尔自动熄火

故障现象 一辆2010款奥迪A4L车,搭载CDZ发动机 ,累计行驶里程约为18.2万km。该车行驶中发动机偶尔自动熄火,有时熄火后能够立即重新起动着机,有时需要等待一会儿才能重新起动着机,故障频率较低。因该故障在其他维修厂陆…

Liam ERD:自动生成美观的交互式实体关系图

Liam ERD 是一个可以快速生成美观且具有交互性的数据库实体关系图(ERD)的工具,可以帮助用户实现复杂数据库结构的可视化。 Liam ERD 是一个免费开源的项目,代码托管在 GitHub: https://github.com/liam-hq/liam 功能…

网络协议序列化工具Protobuf

目录前言一、下载注意二、解压安装三、Protobuf的使用1、创建.proto文件2、利用protoc编译.proto文件前言 Protocol Buffers是Google的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤于(数据)通信协议、数据存储等。 Protoco…

从表单校验到API网关:全链路输入安全防护指南

从表单校验到 API 网关:全链路输入安全防护指南 在软件系统的安全防御体系中,输入安全是第一道防线,而这道防线的坚固程度直接决定了系统抵御外部攻击的能力。从用户在浏览器中填写表单的那一刻起,到数据经过 API 网关流转至后端服务,每一个环节都可能成为输入攻击的突破…

Flask vs Django:微框架与一站式对决

Flask 简介 1、简介 Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架,又称之为微框架。 "微"的含义:Flask旨在保持核心简洁,本身相当于内核,其他功能需通过扩展…

真实业务场景:mysql慢查询优化(从17秒的查询优化到700毫秒)

慢查询业务场景:原先在我们系统中要统计一些人员的单位 部门信息的数据情况,比如总的男女人数,每个单位下的男女人数等等,然后原来的sql是这样写的 根据一个单位的id 然后对一张表做出多个子查询进行查询,这时候统计记录 由于加载…

远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV

文章目录前言【视频教程】1.关于LibreTV2.docker部署LibreTV3.简单使用LibreTV4.安装cpolar内网穿透5.配置ward公网地址6.配置固定公网地址总结LibreTV 与 cpolar 的协同应用,为用户打造了一条通往高清观影自由的便捷之路。通过这一方案,用户不仅摆脱了商…

Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南

简介 ECharts 是百度开源的一个使用 JavaScript 实现的开源可视化库,它能够生动、可交互地展示数据。在 Vue3 项目中集成 ECharts 可以让你的项目更加直观和动态地呈现数据信息。 核心优势 特性SVG渲染器Canvas渲染器缩放保真度★★★★★★★☆☆☆动态交互性能…

考公VS考研,拼哪个性价比高?

即将到来下半年,将迎来考公和考研是两个非常重要的考试,也是许多年轻人为之奋斗的目标。无论是获得一份稳定的“铁饭碗”,还是提升学历学位获得更高的竞争力,都是值得努力的方向。那么,考公vs考研,到底哪个…

python2操作neo4j

环境依赖 jdk、neo4j图数据库 操作一条数据完整demo import os,json,sys,io from py2neo import Graph,Nodetry:sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)sys.stderr io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) except Exception:passcla…