【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了 23 种设计模式。这些模式可以从两个维度进行分类:根据目的和根据作用范围。本文将详细探讨这两种分类方式,并逐一介绍每种模式的功能和应用场景。

1. 根据目的分类

根据设计模式的目的,GoF 将 23 种模式分为三大类:创建型模式结构型模式行为型模式

在这里插入图片描述

1.1 创建型模式(Creational Patterns)

  • 目的:关注对象的创建过程,旨在将对象的创建与使用分离。
  • 模式
    1. 单例模式(Singleton)
      • 功能:确保一个类只有一个实例,并提供全局访问点。
      • 应用场景:数据库连接池、日志管理器。
    2. 工厂方法模式(Factory Method)
      • 功能:定义一个创建对象的接口,由子类决定实例化哪个类。
      • 应用场景:框架中的对象创建,如 Spring 的 Bean 工厂。
    3. 抽象工厂模式(Abstract Factory)
      • 功能:提供一个接口,用于创建相关或依赖对象的家族。
      • 应用场景:跨平台 UI 组件库。
    4. 建造者模式(Builder)
      • 功能:将复杂对象的构建与其表示分离。
      • 应用场景:构建复杂对象,如 HTML 文档。
    5. 原型模式(Prototype)
      • 功能:通过复制现有对象来创建新对象。
      • 应用场景:游戏中的角色复制。

1.2 结构型模式(Structural Patterns)

  • 目的:关注类和对象的组合,旨在形成更大的结构。

  • 模式

    1. 适配器模式(Adapter)
      • 功能:将一个类的接口转换成客户端期望的另一个接口。
      • 应用场景:整合不兼容的接口。
    2. 装饰器模式(Decorator)
      • 功能:动态地为对象添加额外的职责。
      • 应用场景:Java I/O 流。
    3. 代理模式(Proxy)
      • 功能:为其他对象提供一个代理,以控制对其访问。
      • 应用场景:延迟加载、权限控制。
    4. 组合模式(Composite)
      • 功能:将对象组合成树形结构以表示“部分-整体”关系。
      • 应用场景:文件系统、UI 组件树。
    5. 桥接模式(Bridge)
      • 功能:将抽象部分与实现部分分离。
      • 应用场景:多维度变化的系统,如不同形状和颜色的图形。
    6. 外观模式(Facade)
      • 功能:为子系统中的一组接口提供一个统一的接口。
      • 应用场景:简化复杂系统的调用。
    7. 享元模式(Flyweight)
      • 功能:通过共享技术有效地支持大量细粒度对象。
      • 应用场景:文本编辑器中的字符对象。

1.3 行为型模式(Behavioral Patterns)

  • 目的:关注对象之间的职责分配和通信方式。

  • 模式

    1. 观察者模式(Observer)
      • 功能:定义对象间的一对多依赖关系。
      • 应用场景:事件驱动系统,如 GUI 框架中的事件监听。
    2. 策略模式(Strategy)
      • 功能:定义一系列算法,使它们可以互相替换。
      • 应用场景:多种算法或策略的场景,如排序算法。
    3. 命令模式(Command)
      • 功能:将请求封装为对象。
      • 应用场景:撤销操作、任务队列。
    4. 状态模式(State)
      • 功能:允许对象在其内部状态改变时改变其行为。
      • 应用场景:状态机、游戏角色的行为变化。
    5. 模板方法模式(Template Method)
      • 功能:定义一个算法的骨架,将某些步骤延迟到子类中实现。
      • 应用场景:框架中的钩子方法。
    6. 迭代器模式(Iterator)
      • 功能:提供一种方法顺序访问一个聚合对象中的各个元素。
      • 应用场景:集合类的遍历。
    7. 责任链模式(Chain of Responsibility)
      • 功能:将请求的发送者和接收者解耦。
      • 应用场景:审批流程、异常处理链。
    8. 访问者模式(Visitor)
      • 功能:将算法与对象结构分离。
      • 应用场景:编译器中的语法树遍历。
    9. 中介者模式(Mediator)
      • 功能:定义一个中介对象来封装一系列对象之间的交互。
      • 应用场景:聊天室、事件总线。
    10. 备忘录模式(Memento)
      • 功能:捕获并外部化一个对象的内部状态。
      • 应用场景:撤销操作、游戏存档。
    11. 解释器模式(Interpreter)
      • 功能:定义一个语言的文法,并定义一个解释器来解释该语言中的句子。
      • 应用场景:编译器、规则引擎。

2. 根据作用范围分类

根据设计模式的作用范围,GoF 将 23 种模式分为两大类:类模式对象模式

2.1 类模式(Class Patterns)

  • 作用范围:关注类与子类之间的关系,主要通过继承实现。
  • 模式
    • 工厂方法模式(Factory Method)
    • 适配器模式(Adapter,类适配器)
    • 模板方法模式(Template Method)
    • 解释器模式(Interpreter)
2.2 对象模式(Object Patterns)
  • 作用范围:关注对象之间的关系,主要通过组合实现。
  • 模式
    • 单例模式(Singleton)
    • 抽象工厂模式(Abstract Factory)
    • 建造者模式(Builder)
    • 原型模式(Prototype)
    • 适配器模式(Adapter,对象适配器)
    • 装饰器模式(Decorator)
    • 代理模式(Proxy)
    • 组合模式(Composite)
    • 桥接模式(Bridge)
    • 外观模式(Facade)
    • 享元模式(Flyweight)
    • 观察者模式(Observer)
    • 策略模式(Strategy)
    • 命令模式(Command)
    • 状态模式(State)
    • 迭代器模式(Iterator)
    • 责任链模式(Chain of Responsibility)
    • 访问者模式(Visitor)
    • 中介者模式(Mediator)
    • 备忘录模式(Memento)

表 1 介绍了这 23 种设计模式的分类:

范围目的创建型模式结构型模式行为型模式
类模式工厂方法(类)适配器模板方法、解释器
对象模式单例 原型 抽象工厂 建造者代理 (对象)适配器 桥接 装饰 外观 享元 组合策略 命令 职责链 状态 观察者 中介者 迭代器 访问者 备忘录

总结

GoF 的 23 种设计模式从不同角度解决了软件设计中的常见问题。通过根据目的根据作用范围两种分类方式,我们可以更清晰地理解这些模式的核心思想及其适用场景。无论是创建型、结构型还是行为型模式,亦或是类模式和对象模式,它们都为开发人员提供了强大的工具箱,帮助构建灵活、可维护和可扩展的软件系统。

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

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

相关文章

阿里云代理商热销产品推荐

在数字化浪潮的推动下,企业对于云计算的依赖日益加深。阿里云,作为中国领先的云计算服务提供商,为企业提供了丰富多样的云产品和服务。本文将聚焦于阿里云代理商热销产品推荐,探讨其如何帮助企业高效利用云资源,加速数…

[redux] 异步逻辑的两种写法

createAsyncThunk | Redux Toolkit 第一种, extraReducers 普通的reducers只能写同步代码 异步必须得用中间件的形式,就是异步代码调用完有结果了, 再调用同步的reducer, 大概这么理解, 第一种怎么用呢? 先用一个异步函数 const fetchUserById createAsyncThunk(users/fet…

在Java中使用有符号类型模拟无符号整数的技巧

有符号整数和无符号整数 有符号整数:可以表示正数、负数和零。例如,Java中的 byte 类型是有符号的,其范围是 -128 到 127.无符号整数:只能表示非负数(即零和正数)。例如,无符号 byte 应该表示的…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极,LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。 因此通过单片机P0口可控制点阵列,74HC595可控制点阵行 11 脚 SR…

Flutter:邀请海报,Widget转图片,保存相册

记录下,把页面红色区域内的内容,转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

C++Primer const限定符

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

C语言 游动的小球

代码如下&#xff1a; 在这里插入代码片#include<stdio.h> #include<stdlib.h> #include<windows.h>int main() {int i,j;int x 5;int y 10;int height 20;int velocity_x 1;int velocity_y 1;int left 0;int right 20;int top 0;int bottom 10;while(1){…

动漫推荐系统django+vue前台后台完整源码

完整源码项目包获取→点击文章末尾名片&#xff01;

Chapter 1 Understanding Large Language Models

文章目录 Understanding Large Language ModelsWhat is an LLM?Applications of LLMSStages of building and using LLMsUsing LLMS for different tasksA closer look at the GPT architectureBuilding a large language modelSummary Understanding Large Language Models …

什么是VLAN?

VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种将物理局域网划分成多个逻辑上独立的虚拟网络的技术。VLAN不依赖于设备的物理位置&#xff0c;而是通过逻辑划分&#xff0c;将局域网内的设备虚拟地组织到同一组。这种技术允许网络管理员…

【君正T31开发记录】12.编译工具相关总结及介绍

移植交叉工具包的时候&#xff0c;发现这是很多工具的集合包&#xff1b;以及写makefile的时候&#xff0c;也需要了解下这些工具的作用及用法&#xff0c;这里总结记录一下常见的工具及相关用法。 g C编译器&#xff0c;用于编译C源代码文件&#xff0c;这个很常见&#xff0…

Appium(一)--- 环境搭建

一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装&#xff1a;默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加&#xff1a;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin&#xff1b;(3) 验证…

猫的眼睛有几种颜色?

在猫咪神秘而迷人的世界里&#xff0c;它们的眼睛犹如璀璨星辰&#xff0c;闪烁着各异的光芒&#xff0c;颜色丰富多样&#xff0c;令人着迷。 猫眼睛的颜色&#xff0c;粗略一数&#xff0c;常见的便有黄色、蓝色、绿色、棕色&#xff0c;还有那神秘的异瞳。这些色彩并非无端生…

PHP框架+gatewayworker实现在线1对1聊天--接收消息(7)

文章目录 接收消息的原理接收消息JavaScript代码 接收消息的原理 接收消息&#xff0c;就是接受服务器转发的客户端消息。并不需要单独创建函数&#xff0c;因为 ws.onmessage会自动接收消息。我们需要在这个函数里进行处理。因为初始化的时候&#xff0c;已经处理的init类型的…

校园周边美食探索及分享平台的设计与实现(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;前台运行截图后台运行截图 项目简介&#xff08;论文摘要&#xff09; &#xff1a; 美食一直是与人们日常生活息息相关…

基于深度学习的视觉检测小项目(七) 开始组态界面

开始设计和组态画面。 • 关于背景和配色 在组态画面之前&#xff0c;先要确定好画面的风格和色系。如果有前端经验和美术功底&#xff0c;可以建立自己的配色体系。像我这种工科男&#xff0c;就只能从网络上下载一些别人做好的优秀界面&#xff0c;然后在photo shop中抠取色…

wps版excel中如何快速生成倒序序号?

使用wps办公软件打开的excel文件&#xff1a; 效果如下&#xff1a; 方法&#xff1a; 如&#xff1a;想生成此列序号从101~13序号&#xff0c;倒序排列。 在第1个格子中输入开头的最小数字&#xff1a;13 点击一下【13】这个单元格&#xff0c;然后鼠标放在右下角&#xff…

jupyter出现“.ipynb appears to have died. It will restart automatically.”解决方法

原因 解决方法&#xff1a;更新jupyter的版本 1.打开anaconda prompt 2、更新jupyter版本 在anaconda prompt输入以下指令 conda update jupyter如图&#xff1a;

【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图

Flink CDC版本&#xff1a;3.2.1 说明&#xff1a;本文从SchemaOperator接收到&#xff0c;表结构变更事件开始&#xff0c;表结构变更事件应由source端产生&#xff0c;本文不讨论。 可以先看流程图&#xff0c;研究源码。 参考文章&#xff1a; Flink cdc3.0动态变更表结构—…

【编译原理与技术(李文生第二版)】期末复习

第五章 语法制导定义第五章 设计翻译方案√第六章 语义分析-类型表达式&#xff08;仅记录&#xff0c;没说考&#xff09;第七章 参数传递 √第七章 运行栈、display表 √例题1&#xff1a;来源&#xff1a;课件例题2&#xff1a;来源&#xff1a;教材7.4例题3&#xff1a;来源…