创建型设计模式、结构型设计模式与行为型设计模式 上下文任务通用方案 设计模式 大全
设计模式(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 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...