当前位置: 首页 > news >正文

GOF的C++软件设计模式的分类和模式名称

“GOF” 指的是 “Gang of Four”,即“四人帮”,他们是指 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。这四位作者在其著作《Design Patterns: Elements of Reusable Object-Oriented Software》中定义了23种设计模式,这些模式被广泛应用于软件开发中。根据他们解决问题的性质,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。

1. 创建型模式(Creational Patterns

创建型模式主要关注如何创建对象,目的是通过使用不同的方式来创建对象,从而增强程序的灵活性和可复用性。

  • 单例模式(Singleton):确保一个类仅有一个实例,并提供全局访问点。
  • 工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定要实例化的类。
  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 建造者模式(Builder):使用多个简单的对象一步步构建成一个复杂的对象。
  • 原型模式(Prototype):通过复制已有的实例来创建新的对象,而不是通过类构造。

2. 结构型模式(Structural Patterns

结构型模式关注类或对象的组合,旨在通过组合现有类或对象来形成更大的结构。

  • 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。
  • 桥接模式(Bridge):将抽象部分与其实现部分分离,使它们可以独立变化。
  • 组合模式(Composite):将对象组合成树形结构以表示部分-整体的层次结构。
  • 装饰模式(Decorator):动态地给对象添加职责或行为。
  • 外观模式(Facade):为子系统中的一组接口提供一个统一的高层接口。
  • 享元模式(Flyweight):通过共享对象来减少内存占用,适用于大量相似对象的场景。
  • 代理模式(Proxy):通过代理对象控制对某个对象的访问,通常用于控制对象的访问或增加额外的功能。

3. 行为型模式(Behavioral Patterns

行为型模式主要关注对象之间的交互,提供了对象之间的责任分配和通信方式。

  • 责任链模式(Chain of Responsibility):将请求的发送者和接收者解耦,让多个对象都有机会处理请求。
  • 命令模式(Command):将请求封装为一个对象,从而使你可以对请求排队或记录请求日志,以及支持可撤销的操作。
  • 解释器模式(Interpreter):提供一种语言的文法的解释器,主要用于构建语言解析器。
  • 迭代器模式(Iterator):提供一种方法访问一个集合对象中的各个元素,而不暴露该对象的内部表示。
  • 中介者模式(Mediator):用一个中介对象封装一系列的对象交互,促进松耦合。
  • 备忘录模式(Memento):在不破坏封装的情况下,捕获对象的内部状态,并在适当时刻恢复。
  • 观察者模式(Observer):定义对象之间的一对多依赖关系,以便当一个对象改变状态时,所有依赖于它的对象都得到通知并自动更新。
  • 状态模式(State):允许对象在内部状态改变时改变它的行为,使状态的改变看起来像是改变了对象。
  • 策略模式(Strategy):定义一系列算法,并将每一个算法封装起来,使它们可以互换。
  • 模板方法模式(Template Method):在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。
  • 访问者模式(Visitor):表示一个作用于某种数据结构中的各元素的操作,能够在不修改数据结构的前提下定义新的操作。

关注的问题

GOF设计模式着重解决以下问题:

  • 创建问题:如何有效创建对象与控制对象的生命周期(如单例或工厂模式)。
  • 结构问题:如何更高效地组合不同的类和对象以形成复杂的结构(如组合或适配器模式)。
  • 行为问题:如何高效地处理对象之间的交互和责任分配(如观察者、命令和策略模式)。

设计模式的使用不仅可以提升代码的可读性和可维护性,还能提高代码的复用性和灵活性。理解这些模式及其应用场景将有助于设计出更高质量的软件系统。

http://www.lryc.cn/news/479797.html

相关文章:

  • 有向图的完全可达性(有向图搜索全路径的问题) C#DFs
  • 前端开发实现自定义勾选/自定义样式,可复选,可取消勾选
  • 鸿蒙-promptAction.showToast基于PC屏幕底部提示
  • Vert.x,应用监控 - 全链路跟踪,基于Zipkin
  • Rust常用数据结构教程 序列
  • 智慧城市路面垃圾识别系统产品介绍方案
  • 网络安全:构建坚固的数字堡垒
  • LeetCode题练习与总结:打乱数组--384
  • 科技改变生活:最新智能开关、调光器及插座产品亮相
  • 传统RAG流程;密集检索器,稀疏检索器:中文的M3E
  • 基于统计方法的语言模型
  • Flux comfyui 部署笔记,整合包下载
  • 高性能分布式缓存Redis-数据管理与性能提升之道
  • BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测
  • DataWind将字符串数组拆出多行的方法
  • try...catch 和then...catch的异同点分析
  • Mit6.S081-实验环境搭建
  • 以太网交换安全:MAC地址漂移
  • STM32实现串口接收不定长数据
  • AAA 数据库事务隔离级别及死锁
  • 外接数据库给streamlit等web APP带来的变化
  • Gitpod: 我们正在离开 Kubernetes
  • 1.每日SQL----2024/11/7
  • 普通一本大二学生,软件工程,想考研985,想知道哪个大学的软件工程好,又不至于完全考不起的?
  • 「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
  • 让Apache正确处理不同编码的文件避免中文乱码
  • 人员密集场所遇到突发火灾事故该如何应对
  • 使用QtWebEngine的Mac应用如何发布App Store
  • 微机原理与接口技术——中断系统与可编中断控制芯片8259A
  • 【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期