创建型设计模式、结构型设计模式与行为型设计模式 上下文任务通用方案 设计模式 大全

在这里插入图片描述

设计模式(Design Pattern)是一种面向对象编程思想,分为创建型模式、结构型模式与行为型模式三大类,提供在特定上下文中解决常见任务通用方案,旨在让程序(软件)具有更好特点,如降低耦合性、提高内聚性、增强可维护性、可扩展性、重用性和灵活性等。设计模式主要分为以下三种类型:

创建型模式:主要用于创建对象,提供灵活的方式来创建对象,将对象的创建与使用分离,提供了更高的灵活性和可维护性。常见的创建型模式包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式等。

结构型模式:主要用于解决对象之间组合关系、接口定义和实现等结构性问题。结构型模式关注对象之间的组合和关联关系,以及如何通过这些关系来构建更大的结构。常见的结构型模式包括外观模式、适配器模式、代理模式、装饰模式、桥接模式、组合模式、享元模式等。

行为型模式:主要用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务。行为型模式关注对象之间的通信和交互方式,以及如何有效地管理和组织对象的行为。常见的行为型模式包括模板方法模式、观察者模式、状态模式、策略模式、职责链模式、命令模式、访问者模式、调停者模式、备忘录模式、迭代器模式、解释器模式等。

一、创建型模式(Creational Patterns)

  1. 单例模式(Singleton Pattern)

    • 定义:确保一个类只有一个实例,并提供一个全局访问点。
    • 应用场景:配置管理器、连接池管理、日志记录器等。
    • 优点:保证全局只有一个实例,节省内存;提供全局访问点,方便管理。
    • 缺点:如果实例化过程复杂,可能会导致性能问题;难以并行化。
  2. 工厂模式(Factory Pattern)

    • 定义:一种创建对象的模式,将对象的创建过程封装起来,使代码更加灵活和可维护。
    • 分类
      • 简单工厂模式:一个工厂类根据输入参数返回不同的产品实例。
      • 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。
      • 抽象工厂模式:定义一个创建一系列相关或相互依赖对象的接口,而不必指定它们具体的类。
    • 应用场景:对象创建过程复杂、需要灵活地添加新的产品类、需要创建一系列相关或相互依赖的对象。
    • 优点:将对象的创建和使用分离,提高代码的可维护性和可扩展性;可以灵活地添加新的产品类。
    • 缺点:增加了系统的复杂度;如果产品类层次结构复杂,实现起来比较困难。
  3. 建造者模式(Builder Pattern)

    • 定义:将一个复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。
    • 应用场景:创建对象的构建过程比较复杂,而且需要创建不同表示时。
    • 优点:使构建过程更加清晰,易于理解和管理;可以创建复杂对象的不同表示。
    • 缺点:增加了代码量,需要定义多个类。
  4. 原型模式(Prototype Pattern)

    • 定义:通过复制原型对象的方式创建新对象,而无需知道其具体的实现细节。
    • 应用场景:对象的创建过程比较复杂或者对象的初始化过程需要耗费大量时间。
    • 优点:提高对象创建的性能;避免复杂对象的初始化过程。
    • 缺点:需要维护一个原型对象集合,可能增加内存开销。

二、结构型模式(Structural Patterns)

  1. 适配器模式(Adapter Pattern)

    • 定义:将一个类的接口转换成客户希望的另一个接口。
    • 应用场景:需要使用一个已经存在的类,但其接口与系统中的其他接口不匹配时。
    • 优点:使原本接口不兼容的类可以一起工作;提高了代码的复用性。
    • 缺点:增加了代码复杂性,需要创建适配器类。
  2. 装饰器模式(Decorator Pattern)

    • 定义:动态地给一个对象添加一些额外的职责。
    • 应用场景:需要在不修改现有对象结构的情况下,动态地给对象添加功能。
    • 优点:比生成子类方式更为灵活;可以动态地扩展对象的功能。
    • 缺点:可能导致过多的装饰器层级,增加代码复杂性。
  3. 代理模式(Proxy Pattern)

    • 定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
    • 应用场景:需要实现对象的延迟初始化、控制对对象的访问、实现日志记录等功能。
    • 优点:控制对真实对象的访问;提高代码的安全性和灵活性。
    • 缺点:增加了系统的复杂度;如果代理对象过多,可能导致性能问题。
  4. 外观模式(Facade Pattern)

    • 定义:提供了一个统一的接口,用来访问子系统中的一群接口。
    • 应用场景:需要简化复杂系统的接口并提供一个统一的入口点时。
    • 优点:隐藏了子系统的复杂性;提供了一个简化的接口。
    • 缺点:可能会违背单一职责原则,导致外观对象过于庞大。
  5. 桥接模式(Bridge Pattern)

    • 定义:将抽象部分与实现部分分离,使它们可以独立变化。
    • 应用场景:当一个类存在多个维度的变化时,可以使用桥接模式来将这些维度进行分离。
    • 优点:提高了系统的灵活性和可扩展性。
    • 缺点:增加了代码复杂性,需要定义多个类。
  6. 组合模式(Composite Pattern)

    • 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。
    • 应用场景:需要表示对象的层次结构,并且希望客户统一处理单个对象和组合对象时。
    • 优点:客户可以统一处理单个对象和组合对象;提高了代码的复用性。
    • 缺点:限制了组合对象的类型,可能导致设计过度。
  7. 享元模式(Flyweight Pattern)

    • 运用共享技术有效地支持大量细粒度的对象。
    • 通过共享来减少对象的数量,从而提高性能。

三、行为型模式(Behavioral Patterns)

  1. 策略模式(Strategy Pattern)

    • 定义:定义了一系列的算法,并将每一个算法封装起来,使它们可以互换。
    • 应用场景:需要根据不同的条件选择不同的算法、算法需要经常变化或扩展、需要将算法的实现细节隐藏起来。
    • 优点:算法和客户端分离,提高了代码的可维护性和可扩展性。
    • 缺点:策略类的数量可能会增加,导致类的膨胀。
  2. 观察者模式(Observer Pattern)

    • 定义:定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
    • 应用场景:事件监听机制、发布/订阅系统、GUI组件之间的交互。
    • 优点:实现了主题和观察者之间的解耦;提高了代码的可维护性和可扩展性。
    • 缺点:如果观察者数量过多,可能会导致性能问题。
  3. 命令模式(Command Pattern)

    • 定义:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
    • 应用场景:需要实现命令的封装和执行、实现命令的队列和撤销功能。
    • 优点:实现了命令的封装和执行的分离;提高了代码的可维护性和可扩展性。
    • 缺点:可能会导致类的数量增加,使系统变得复杂。
  4. 迭代器模式(Iterator Pattern)

    • 定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
    • 应用场景:需要遍历一个聚合对象,并且希望客户端代码与集合的具体实现解耦时。
    • 优点:支持以不同的方式遍历聚合对象;提高了代码的复用性和灵活性。
    • 缺点:需要实现迭代器接口,增加了代码复杂性。
  5. 中介者模式(Mediator Pattern)

    • 定义:用一个中介对象来封装一系列的对象交互。
    • 应用场景:多个对象之间存在复杂的交互关系,并且希望通过一个中介者来管理这些交互关系时。
    • 优点:使对象之间的交互更加清晰和简单;降低了系统的复杂性。
    • 缺点:增加了代码复杂性,中介者对象可能会变得庞大。
  6. 模板方法模式(Template Method Pattern)

    • 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
    • 应用场景:在父类中定义算法的框架,在子类中实现具体的步骤。
    • 优点:定义了一个算法的框架,提高了代码的可复用性和可扩展性。
    • 缺点:子类的扩展可能会影响算法的整体结构。
  7. 状态模式(State Pattern)

    • 定义:允许对象在内部状态改变时改变它的行为。
    • 应用场景:对象的行为随其内部状态的变化而变化时。
    • 优点:将状态相关的行为封装在状态类中;提高了代码的可维护性和可读性。
    • 缺点:增加了类的数量;状态类可能会变得复杂。
  8. 责任链模式(Chain of Responsibility Pattern)

    • 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。
    • 应用场景:有多个对象可以处理同一个请求,并且处理器之间的顺序可以灵活调整时。
    • 优点:降低了请求的发送者和接收者之间的耦合度;提高了系统的灵活性。
    • 缺点:可能导致请求的处理链过长,难以调试和定位错误。
  9. 访问者模式(Visitor Pattern)

    • 定义:将数据结构和对数据的操作分离,使得可以在不改变数据结构的前提下定义新的操作。
    • 应用场景:需要对一个复杂的对象结构中的不同元素执行不同的操作时。
    • 优点:增加了新的操作很容易,无需修改已有的类;提高了代码的复用性和可扩展性。
    • 缺点:需要在数据结构中添加访问者接受方法,增加了代码复杂性。
  10. 备忘录模式(Memento Pattern)

    • 定义:在不破坏封装的前提下,捕获并保存对象的内部状态,以便后续恢复。
    • 应用场景:需要保存和恢复对象的状态时。
  11. 解释器模式(Interpreter Pattern)

    • 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
    • 实现了特定语法规则的解释和执行。

综上所述,设计模式涵盖了创建型模式、结构型模式和行为型模式三大类,共包括23种具体的设计模式。每种设计模式都有其特定的应用场景和优缺点,开发者可以根据实际需求选择合适的设计模式来提高代码的可复用性、灵活性和可扩展性。

在这里插入图片描述

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

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

相关文章

如何查看下载到本地的大模型的具体大小?占了多少存储空间:Llama-3.1-8B下载到本地大概15GB

这里介绍一下tree命令,可以方便的查看文件目录结构和文件大小。 命令行tree的具体使用,请参考笔者的另一篇博客:深入了解 Linux tree 命令及其常用选项:Linux如何显示目录结构和文件大小,一言以蔽之,sudo a…

MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据

前言 在一次 MySQL 的线上查询操作中,因为 ! 的特性导致未能正确查询到为 NULL 的数据,险些引发严重后果。本文将详细解析 NULL 在 SQL 中的行为,如何避免类似问题,并提供实际操作建议。 1. 为什么NULL会查询不到? 在…

4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传

一、引言 在当今社会,安全问题始终是人们关注的重中之重。无论是家庭、企业还是公共场所,都需要一套可靠的安全防护系统来保障人员和财产的安全。随着科技的飞速发展,4G 报警器应运而生,为安全防范领域带来了全新的解决方案。…

U盘格式化工具合集:6个免费的U盘格式化工具

在日常使用中,U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间,还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具,并详细介绍它们的功能、使用方法、优缺…

玩转OCR | 腾讯云智能结构化OCR初次体验

目录 一、什么是OCR(需要了解) 二、产品概述与核心优势 产品概述 智能结构化能做什么 举例说明(选看) 1、物流单据识别 2、常见证件识别 3、票据单据识别 4、行业材料识别 三、产品特性 高精度 泛化性 易用性 四、…

基于微信小程序的校园自助打印系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

driftingblues6_vh靶机

首先把靶机换成NAT模式 使用 arp-scan 命令扫描网段内存活的主机,以获取靶机ip地址 arp-scn -l 尝试访问ip 使用御剑扫描子域名,尝试访问robots.txt文件 通过访问文件我们发现了一个/textpattern/textpattern目录 访问一下目录发现了登录页面 他还给了…

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知,其PA9和PA10引脚分别为UART的TX和RX(注意:这个电路图是错误的,应该是PA9是X而PA9是RX,我们看下图的官方文件可以看出),那么接下来我们应该找到该引脚的定义是什么&#xf…

数据库自增 id 过大导致前端时数据丢失

可以看到,前端响应参数是没有丢失精度的 但是在接受 axios 请求参数时出现了精度丢失 解决方案一:改变 axios 字符编码 axios.defaults.headers[Content-Type] application/json;charsetUTF-8; 未解决 解决方案二:手动使用 json.parse() …

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …

闻泰科技涨停-操盘训练营实战-选股和操作技术解密

如上图,闻泰科技,今日涨停,这是前两天分享布局的一个潜伏短线的标的。 选股思路: 1.主图指标三条智能辅助线粘合聚拢,即将选择方向 2.上图红色框住部分,在三线聚拢位置,震荡筑底,…

计算机体系结构期末复习3:GPU架构及控制流问题

目录 一、GPU设计思路 1.简化流水线、增加核数 2.单指令多线程(SIMT) 3.同时驻留大量线程 4.总思路:多线程单指令多线程 二、GPU的控制流问题 1.什么是控制流问题 2.怎么应对分支分歧 一、GPU设计思路 1.简化流水线、增加核数 2.单指…

面试241228

面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…

2024 年发布的 Android AI 手机都有什么功能?

大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)

导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行,以及多域耦合、AI求解加速,目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地,支持10亿阶、100w核心量级的高效求解。其低…

Windows 下安装 triton 教程

目录 背景解决方法方法一:(治标不治本)方法二:(triton-windows)- 安装 MSVC 和 Windows SDK- vcredist 安装- whl 安装- 验证 背景 triton 目前官方只有Linux 版本,若未安装,则会出…

Kali 自动化换源脚本编写与使用

1. 背景与需求 在使用 Kali Linux 的过程中,软件源的配置对系统的更新与软件安装速度至关重要。 Kali 的默认官方源提供了安全且最新的软件包,但有时由于网络条件或地理位置的限制,使用官方源可能会出现速度较慢的问题。 为了解决这一问题&a…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果,可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面是JavaScript 处理…

基于Docker的ETCD分布式集群

目录 1. 说明 2. 配置表 3. 步骤 3.1 放行端口 3.2 docker-compose 文件 3.3 部署到3台服务器 3.4 相关命令 4. 参考 1. 说明 - 以docker容器方式实现ETCD分布式集群,为其他项目提供支持,经过反复试验成功部署(网上资料大都过期或部署失败)。 -…

CUDA与Microsoft Visual Studio不兼容问题

简介:在安装一些 python库时,涉及到第三方库(特别是需要引用 C 代码)时,通常的安装方式会涉及到编译过程,通常称为"源代码安装"(source installation),或是 “…