创建型设计模式、结构型设计模式与行为型设计模式 上下文任务通用方案 设计模式 大全
设计模式(Design Pattern)是一种面向对象编程的思想,分为创建型模式、结构型模式与行为型模式三大类,它们提供了在特定上下文中解决常见任务的通用方案,旨在让程序(软件)具有更好的特点,如降低耦合性、提高内聚性、增强可维护性、可扩展性、重用性和灵活性等。设计模式主要分为以下三种类型:
创建型模式:主要用于创建对象,提供灵活的方式来创建对象,将对象的创建与使用分离,提供了更高的灵活性和可维护性。常见的创建型模式包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式等。
结构型模式:主要用于解决对象之间组合关系、接口定义和实现等结构性问题。结构型模式关注对象之间的组合和关联关系,以及如何通过这些关系来构建更大的结构。常见的结构型模式包括外观模式、适配器模式、代理模式、装饰模式、桥接模式、组合模式、享元模式等。
行为型模式:主要用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务。行为型模式关注对象之间的通信和交互方式,以及如何有效地管理和组织对象的行为。常见的行为型模式包括模板方法模式、观察者模式、状态模式、策略模式、职责链模式、命令模式、访问者模式、调停者模式、备忘录模式、迭代器模式、解释器模式等。
一、创建型模式(Creational Patterns)
-
单例模式(Singleton Pattern)
- 定义:确保一个类只有一个实例,并提供一个全局访问点。
- 应用场景:配置管理器、连接池管理、日志记录器等。
- 优点:保证全局只有一个实例,节省内存;提供全局访问点,方便管理。
- 缺点:如果实例化过程复杂,可能会导致性能问题;难以并行化。
-
工厂模式(Factory Pattern)
- 定义:一种创建对象的模式,将对象的创建过程封装起来,使代码更加灵活和可维护。
- 分类:
- 简单工厂模式:一个工厂类根据输入参数返回不同的产品实例。
- 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。
- 抽象工厂模式:定义一个创建一系列相关或相互依赖对象的接口,而不必指定它们具体的类。
- 应用场景:对象创建过程复杂、需要灵活地添加新的产品类、需要创建一系列相关或相互依赖的对象。
- 优点:将对象的创建和使用分离,提高代码的可维护性和可扩展性;可以灵活地添加新的产品类。
- 缺点:增加了系统的复杂度;如果产品类层次结构复杂,实现起来比较困难。
-
建造者模式(Builder Pattern)
- 定义:将一个复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。
- 应用场景:创建对象的构建过程比较复杂,而且需要创建不同表示时。
- 优点:使构建过程更加清晰,易于理解和管理;可以创建复杂对象的不同表示。
- 缺点:增加了代码量,需要定义多个类。
-
原型模式(Prototype Pattern)
- 定义:通过复制原型对象的方式创建新对象,而无需知道其具体的实现细节。
- 应用场景:对象的创建过程比较复杂或者对象的初始化过程需要耗费大量时间。
- 优点:提高对象创建的性能;避免复杂对象的初始化过程。
- 缺点:需要维护一个原型对象集合,可能增加内存开销。
二、结构型模式(Structural Patterns)
-
适配器模式(Adapter Pattern)
- 定义:将一个类的接口转换成客户希望的另一个接口。
- 应用场景:需要使用一个已经存在的类,但其接口与系统中的其他接口不匹配时。
- 优点:使原本接口不兼容的类可以一起工作;提高了代码的复用性。
- 缺点:增加了代码复杂性,需要创建适配器类。
-
装饰器模式(Decorator Pattern)
- 定义:动态地给一个对象添加一些额外的职责。
- 应用场景:需要在不修改现有对象结构的情况下,动态地给对象添加功能。
- 优点:比生成子类方式更为灵活;可以动态地扩展对象的功能。
- 缺点:可能导致过多的装饰器层级,增加代码复杂性。
-
代理模式(Proxy Pattern)
- 定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
- 应用场景:需要实现对象的延迟初始化、控制对对象的访问、实现日志记录等功能。
- 优点:控制对真实对象的访问;提高代码的安全性和灵活性。
- 缺点:增加了系统的复杂度;如果代理对象过多,可能导致性能问题。
-
外观模式(Facade Pattern)
- 定义:提供了一个统一的接口,用来访问子系统中的一群接口。
- 应用场景:需要简化复杂系统的接口并提供一个统一的入口点时。
- 优点:隐藏了子系统的复杂性;提供了一个简化的接口。
- 缺点:可能会违背单一职责原则,导致外观对象过于庞大。
-
桥接模式(Bridge Pattern)
- 定义:将抽象部分与实现部分分离,使它们可以独立变化。
- 应用场景:当一个类存在多个维度的变化时,可以使用桥接模式来将这些维度进行分离。
- 优点:提高了系统的灵活性和可扩展性。
- 缺点:增加了代码复杂性,需要定义多个类。
-
组合模式(Composite Pattern)
- 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。
- 应用场景:需要表示对象的层次结构,并且希望客户统一处理单个对象和组合对象时。
- 优点:客户可以统一处理单个对象和组合对象;提高了代码的复用性。
- 缺点:限制了组合对象的类型,可能导致设计过度。
-
享元模式(Flyweight Pattern)
- 运用共享技术有效地支持大量细粒度的对象。
- 通过共享来减少对象的数量,从而提高性能。
三、行为型模式(Behavioral Patterns)
-
策略模式(Strategy Pattern)
- 定义:定义了一系列的算法,并将每一个算法封装起来,使它们可以互换。
- 应用场景:需要根据不同的条件选择不同的算法、算法需要经常变化或扩展、需要将算法的实现细节隐藏起来。
- 优点:算法和客户端分离,提高了代码的可维护性和可扩展性。
- 缺点:策略类的数量可能会增加,导致类的膨胀。
-
观察者模式(Observer Pattern)
- 定义:定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
- 应用场景:事件监听机制、发布/订阅系统、GUI组件之间的交互。
- 优点:实现了主题和观察者之间的解耦;提高了代码的可维护性和可扩展性。
- 缺点:如果观察者数量过多,可能会导致性能问题。
-
命令模式(Command Pattern)
- 定义:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
- 应用场景:需要实现命令的封装和执行、实现命令的队列和撤销功能。
- 优点:实现了命令的封装和执行的分离;提高了代码的可维护性和可扩展性。
- 缺点:可能会导致类的数量增加,使系统变得复杂。
-
迭代器模式(Iterator Pattern)
- 定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
- 应用场景:需要遍历一个聚合对象,并且希望客户端代码与集合的具体实现解耦时。
- 优点:支持以不同的方式遍历聚合对象;提高了代码的复用性和灵活性。
- 缺点:需要实现迭代器接口,增加了代码复杂性。
-
中介者模式(Mediator Pattern)
- 定义:用一个中介对象来封装一系列的对象交互。
- 应用场景:多个对象之间存在复杂的交互关系,并且希望通过一个中介者来管理这些交互关系时。
- 优点:使对象之间的交互更加清晰和简单;降低了系统的复杂性。
- 缺点:增加了代码复杂性,中介者对象可能会变得庞大。
-
模板方法模式(Template Method Pattern)
- 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
- 应用场景:在父类中定义算法的框架,在子类中实现具体的步骤。
- 优点:定义了一个算法的框架,提高了代码的可复用性和可扩展性。
- 缺点:子类的扩展可能会影响算法的整体结构。
-
状态模式(State Pattern)
- 定义:允许对象在内部状态改变时改变它的行为。
- 应用场景:对象的行为随其内部状态的变化而变化时。
- 优点:将状态相关的行为封装在状态类中;提高了代码的可维护性和可读性。
- 缺点:增加了类的数量;状态类可能会变得复杂。
-
责任链模式(Chain of Responsibility Pattern)
- 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。
- 应用场景:有多个对象可以处理同一个请求,并且处理器之间的顺序可以灵活调整时。
- 优点:降低了请求的发送者和接收者之间的耦合度;提高了系统的灵活性。
- 缺点:可能导致请求的处理链过长,难以调试和定位错误。
-
访问者模式(Visitor Pattern)
- 定义:将数据结构和对数据的操作分离,使得可以在不改变数据结构的前提下定义新的操作。
- 应用场景:需要对一个复杂的对象结构中的不同元素执行不同的操作时。
- 优点:增加了新的操作很容易,无需修改已有的类;提高了代码的复用性和可扩展性。
- 缺点:需要在数据结构中添加访问者接受方法,增加了代码复杂性。
-
备忘录模式(Memento Pattern)
- 定义:在不破坏封装的前提下,捕获并保存对象的内部状态,以便后续恢复。
- 应用场景:需要保存和恢复对象的状态时。
-
解释器模式(Interpreter Pattern)
- 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
- 实现了特定语法规则的解释和执行。
综上所述,设计模式涵盖了创建型模式、结构型模式和行为型模式三大类,共包括23种具体的设计模式。每种设计模式都有其特定的应用场景和优缺点,开发者可以根据实际需求选择合适的设计模式来提高代码的可复用性、灵活性和可扩展性。
相关文章:

创建型设计模式、结构型设计模式与行为型设计模式 上下文任务通用方案 设计模式 大全
设计模式(Design Pattern)是一种面向对象编程的思想,分为创建型模式、结构型模式与行为型模式三大类,它们提供了在特定上下文中解决常见任务的通用方案,旨在让程序(软件)具有更好的特点…...

Mac 环境 VVenC 编译与编码命令行工具使用教程
VVenC VVenC 是一个开源的高效视频编码器,专门用于支持 H.266/VVC (Versatile Video Coding) 标准的编码。H.266/VVC 是继 HEVC (H.265) 之后的新一代视频编码标准,主要目的是提供比 HEVC 更高的压缩效率,同时保持或提高视频质量。H.266/VVC…...

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程
简介 本教程将教你如何优化 Nginx,使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器,以其高效处理大量并发连接的能力而闻名,这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能࿰…...

springcloud各个组件介绍
Spring Cloud 是一系列框架的集合,它基于 Spring Boot 提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)中快速构建一些常见模式的工具。下面是对 Sprin…...

HTML5实现好看的喜庆圣诞节网站源码
HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码,圣…...

《学习之道》
《学习之道》主要讲述了以下内容: 学习的原理 大脑的两种认知模式:介绍了专注模式和发散模式。专注模式适合集中精力解决具体问题、进行深度理解和记忆推理,但长时间使用易疲惫和陷入思维定式;发散模式则让大脑在更广泛的认知网…...

【Unity3D】ECS入门学习(十一)ComponentSystem、JobComponentSystem
ComponentSystem:仅支持主线程执行,不支持多线程,并且无法使用SystemBase介绍的扩展方法。 using Unity.Entities; using Unity.Transforms; using Unity.Mathematics;/// <summary> /// 仅主线程执行,不支持多线程 /// &l…...

力扣刷题:栈和队列OJ篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.用队列实现栈(1)题目…...

XGPT用户帮助手册
文章目录 2024 更新日志2024.12.272024.12.29 摘要 本文详细介绍了XGPT软件的功能及发展历程。XGPT是一款融合了当前最先进人工智能技术的多模态智能软件,专为国内用户优化设计。除了强大的智能问答功能外,XGPT还结合日常办公和科学研究的需求࿰…...

Oracle 数据库 dmp文件从高版本导入低版本的问题处理
当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...

ShardingSphere-Proxy分表场景测试案例
快速入门文章参考:《ShardingSphereProxy:快速入门》 基于K8S部署文章参考:《基于K8s部署ShardingSphere-Proxy》 基于golang的测试用例参考:《ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用》 背景 我们…...

学技术学英文:Tomcat的线程模型调优
导读: tomcat 线程调优关键需要理解下面这几个参数: 1. maxConnections 描述:指定服务器能够同时接受和处理的最大连接数。也就是说,服务器在任何时候都能处理的最大并发连接数。作用:限制服务器在任何给定时间点能…...

创建flutter项目遇到无法连接源的问题
Flutter 环境信息 Flutter版本: 3.19.4 (channel stable) Framework: revision 68bfaea224 (2024-03-20) Engine: revision a5c24f538d Dart: 3.3.2 DevTools: 2.31.1 项目基本信息 项目路径: D:\F\luichun 域名: www.luichun.com.cn 支持平台: android, web, windows 项目创…...

MAC系统QT图标踩坑记录
MAC系统QT图标踩坑记录 1. 准备图标1.1 方法一:下载准备好的图标1.2 方法二:自己生成图标1.2.1 准备一个png文件1.2.2 用sips生成不同大小的图片1.2.3 用iconutil生成图标文件 2. 配置图标2.1. 把图标改命成自己想要的名字,如icon.icns&#…...

TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)
中文版 TF-IDF算法详解:理解与应用 TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索与文本挖掘中常用的算法,广泛应用于搜索引擎、推荐系统以及各种文本分析领域。TF-IDF的核心思想是通过计算一个词在文档中的重要…...

【竞技宝】CS2:HLTV2024职业选手排名TOP15-xantares
北京时间2024年12月30日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP15选手为EternalFire战队的xantares选手。 选手简介 xantares是一名来自于土耳其的CS职业选手,出生于1995年,今年已经29岁。早在2012年&…...

Spring-kafka快速Demo示例
使用Spring-Kafka快速发送/接受Kafka消息示例代码,项目结构是最基础的SpringBoot结构,提前安装好Kafka,确保Kafka已经正确启动 pom.xml,根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…...

客户案例:基于慧集通集成平台,打通屠宰管理系统与用友U8C 系统的全攻略
一、引言 本原型客户成立于2014年,是一家集饲草种植、肉牛养殖、精深加工、冷链物流、餐饮服务于一体的大型农牧综合体。公司下设三个子公司分别涵盖农业、畜牧业、肉制品加工业与餐饮物流服务业。公司严格按照一二三产业融合发展要求,以肉牛产业化为支…...

模型 九屏幕分析法
系列文章 分享 模型,了解更多👉 模型_思维模型目录。九屏幕法:全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机,为了全面评估市场潜力和风险,他们…...

Qanything 2.0源码解析系列6 PDF解析逻辑
Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...

MAC系统QT Creator的快捷键
安装好QT Creator后使用了一段时间,真是越用越难受,只想说🗑️。。。 找一圈qt creator的快捷键 0. 快捷键界面 这里的搜索真的是…无语,不考虑是人查找吗?? 1. 代码前后浏览 2. 移动代码 3. 半自动导入…...

【深度学习】多目标融合算法—样本Loss提权
目录 一、引言 二、样本Loss提权 2.1 技术原理 2.2 技术优缺点 三、总结 一、引言 在朴素的深度学习ctr预估模型中(如DNN),通常以一个行为为预估目标,比如通过ctr预估点击率。但实际推荐系统业务场景中,更多是多…...

C 实现植物大战僵尸(四)
C 实现植物大战僵尸(四) C 实现植物大战僵尸,完结撒花(还有个音频稍卡顿的性能问题,待有空优化解决)。目前基本的功能模块已经搭建好了,感兴趣的友友可自行尝试编写后续游戏内容 因为 C 站不能…...

Tailwind CSS:现代 CSS 框架的优雅之选
Tailwind CSS:现代 CSS 框架的优雅之选 在现代前端开发中,CSS 的灵活性和复杂性让开发者在设计与实现之间寻找平衡。而 Tailwind CSS 的出现,重新定义了 CSS 框架的使用方式。它是一种原子化的 CSS 工具库,提供了丰富的类名以快速…...

MyBatis 使用的设计模式详解
MyBatis 是一个优秀的持久层框架,它简化了 Java 应用程序与数据库之间的交互。为了实现高效、灵活且易于维护的代码,MyBatis 内部使用了多种设计模式。本文将详细介绍 MyBatis 中应用到的设计模式及其作用。 工厂模式(Factory Pattern&#x…...

LabVIEW 中 NI Vision 模块的IMAQ Create VI
IMAQ Create VI 是 LabVIEW 中 NI Vision 模块(NI Vision Development Module)的一个常用 VI,用于创建一个图像变量。该图像变量可以存储和操作图像数据,是图像处理任务的基础。 通过以上操作,IMAQ Create VI 是构建…...

2024 年度总结
时光荏苒,2024 年即将画上句号,回顾这一年的写博历程,有付出、有收获、有成长,也有诸多值得回味与反思的瞬间。 一、内容创作 主题涉猎:这一年,我致力于探索多样化的主题,以满足不同读者群体的…...

STM32 高级 物联网通讯之LoRa通讯
目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…...

【笔记】在虚拟机中通过apache2给一个主机上配置多个web服务器
(配置出来的web服务器又叫虚拟主机……) 下载apache2 sudo apt update sudo apt install apache2 (一)ip相同 web端口不同的web服务器 进入 /var/www/html 创建站点一和站点二的目录文件(目录文件名自定义哈&#x…...

数据库的创建与删除:理论与实践
title: 数据库的创建与删除:理论与实践 date: 2024/12/31 updated: 2024/12/31 author: cmdragon excerpt: 在当今的数字时代,数据的管理和存储变得尤为重要。数据库作为数据存储的结构化方案,为数据的增删改查提供了系统化的方法。在一个典型的数据库管理系统中,创建和…...