C# 设计模式概况

什么是设计模式

大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF。总结了在面向 对象语言开发过程中常见问题的解决方案。

设计模式是面向对象语言开发过程中,遇到的种种场景和问题,然后提出的思路 和解决方案,最后沉淀下来,就成了设计模式。

设计模式其实就是解决问题的思路,是前辈总结出来的有效方式方法,就是套路! 学习设计模式,就是为了站在前辈的肩膀上,能更快捷优雅的解决面向对象程序 开发设计问题。

设计模式分类

创建型

单例模式 

‌单例模式(Singleton Pattern)是确保一个类只有一个实例,并提供一个全局访问点来访问该实例的设计模式‌。它是创建型模式的一种,在多种编程语言中都有实现,包括Java和C++‌。

单例模式涉及到一个单一的类,该类负责创建自己的对象,并确保只有单个对象被创建。这个类还提供了一种访问其唯一对象的方式,允许其他对象直接访问,而无需实例化该类的对象‌。

工厂模式 

工厂模式(Factory Pattern)是创建型设计模式的一种,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂模式让类的实例化推迟到子类。

在工厂模式中,我们定义一个创建对象的接口,但让子类来决定实例化哪一个类。这样,工厂方法将对象的实例化推迟到了子类,使得客户端不需要知道它们所使用的对象类的名字,只需要知道所对应的工厂即可。

工厂方法模式

工厂方法模式(Factory Method Pattern)是创建型设计模式之一,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让一个类的实例化延迟到其子类,从而实现了灵活的对象创建机制,而无需在客户端代码中显式指定具体要创建的对象类型。

原型模式 

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来生成新对象,而不是通过实例化类来创建。这种模式基于对象的克隆机制,特别适用于需要频繁创建对象的场景,可以提高性能并减少复杂的初始化过程。

建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它的主要目的是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式通过将对象的各部分组件的单独构造和组装分离,从而可以构造出不同的复杂对象。

结构型

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它旨在将一个类的接口转换为客户端所期待的接口,使得原本由于接口不兼容而无法在一起工作的类能够协同工作。适配器模式的核心思想是“适配”,即通过创建一个适配器类,使得两个不兼容的类能够合作。

装饰器模式

装饰器模式(Decorator Pattern)是结构型设计模式的一种,也称为包装模式(Wrapper Pattern)。其核心思想是在不改变原有对象结构的基础上,动态地给该对象增加一些额外功能。装饰器模式提供了一种比继承更灵活的扩展对象功能的方式。

代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理或占位符,以控制对这个对象的访问。代理模式涉及到一个代理对象和一个真实对象,代理对象代表真实对象,并在客户端和目标对象之间起到中介的作用。

外观模式

外观模式(Facade Pattern),又称为门面模式,是 GoF(四人帮)提出的 23 种设计模式中的一种结构型设计模式。外观模式的主要目的是为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,从而降低子系统与客户端的耦合度。

桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它主要用于将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式的核心思想是将抽象与实现解耦,通过组合的方式而不是继承来实现,从而增加系统的灵活性和可扩展性。

组合模式

组合模式(Composite Pattern),又叫部分整体模式,是一种结构型设计模式。它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式的核心思想是让用户对单个对象和组合对象的访问具有一致性,即组合模式能让客户以一致的方式处理个别对象以及组合对象。

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它主要用于减少创建对象的数量,以节省内存和提高性能。享元模式通过共享相同的对象,使得在系统中只有一份实例被多个客户端使用,从而实现对象的复用。

行为型

策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式的核心思想是将算法的实现与算法的使用分离,使得算法可以独立于使用它的客户而变化。

模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的框架,并将某些步骤延迟到子类中实现,以便子类可以重新定义算法的某些步骤而不改变算法的结构。

观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。这种设计模式主要用于实现发布-订阅机制。

迭代子模式

迭代子模式(Iterator Pattern),也称为迭代器模式,是一种行为型设计模式。它提供了一种顺序访问聚合对象中的元素而不必暴露其内部表象的方法。

责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将多个处理对象通过链式结构连接起来,以形成一条处理请求的链条。每个处理对象都有机会处理请求,或者将请求传递给链中的下一个对象。这样,客户端不需要知道哪个具体的对象会处理请求,而是通过责任链的结构来自动地传递和处理请求。

命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的主要作用是将请求发送者和接收者解耦,使得发送者无需知道接收者的具体实现,从而增加系统的灵活性和可扩展性。

备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,主要用于在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便将来可以恢复到该状态。备忘录模式提供了一种保存和恢复对象状态的机制,常用于需要实现撤销操作、保存历史状态或恢复先前状态的场景。

状态模式

状态模式(State Pattern)是一种对象行为型模式,它允许一个对象在其内部状态发生改变时改变它的行为,看起来像是修改了其类。状态模式将对象的行为封装在不同的状态对象中,每个状态对象都定义了对象在该状态下的行为。当对象的状态改变时,它的行为也会随之改变。

访问者模式

访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你将数据结构与作用于结构上的操作解耦,使得可以在不修改数据结构的情况下添加新的操作或访问方式。访问者模式通过定义不同的访问者实现对数据的不同操作,从而在不改变数据结构的前提下动态地添加作用于这些元素上的操作。

中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个中介对象来封装一系列对象之间的交互,使得对象之间不直接相互引用和通信,而是通过中介者来进行间接通信。中介者模式的主要目的是降低系统中对象之间的耦合度,提高系统的灵活性和可维护性。

解释器模式

解释器模式(Interpreter Pattern)是一种行为设计模式,主要用于处理特定语言的句法分析和解释。它定义了一种表示文法的方式,并通过解释器实现对特定语言的解释。解释器模式的核心在于将语言的文法结构表示为抽象语法树(AST),并定义解释器来遍历这棵语法树并执行相应的操作。

设计模式分类

  • 1 创建型设计模式:关注对象的创建,new的花样就有很多
  • 2 结构型设计模式:关注类与类之间的关系,关系有很多种, “组合优于继承”
  • 3 行为型设计模式:关注对象和行为的关系(类和方法),就是方法到底该放到哪里

三大工厂

简单工厂模式(SimpleFactoryPattern): 是通过专门定义一个类来负责创建其他类的实例, 被创建的实例通常都具有共同的父类。

工厂方法模式(FactoryMethodPattern) 通过定义工厂父类负责定义创建对象的公共接口, 而子类则负责生成具体的对象。 每一个不同的的对象分别自定义个工厂+抽象;

抽象工厂模式(AbstractFactoryPattern) 在抽象工厂模式中,接口是负责创建一个相关对象的工厂。 每个生成的工厂都能按照工厂模式提供对象。 工厂+约束! 

创建对象的几种方式

  • 1 直接new一下
  • 2 单例一下
  • 3 原型一下
  • 4 三大工厂—就是转移对象的创建
  • 5 建造者—更复杂的工厂方法 

说到底,都是在折腾怎么New一个对象!这也是创建型设计模式的核心了! 

设计模式总结

创建型:花样new---关注对象的创建。

结构型:包一层------关注类与类之间的关系,组合优于继承,A里面有个B,调用 A完成调用B,所以就是包一层。

行为型:甩锅--------关注的是对象和行为的分离,对象和方法的问题,方法到底 放在哪里,把不稳定的东西丢给别人管理,所以就是甩锅 看懂需求,抓住矛盾,找到套路,实现了再看是啥模式 。

看懂需求,抓住矛盾,找到套路,实现了再看是啥模式。

设计模式终极建议

  • 1 设计模式不是单一使用,而是融合,要扬长避短
  • 2 设计模式就那么几个核心套路,解决问题时请不要拘泥于招数,直接上套路 解决就完了,然后你再看看是属于什么模式的
  • 3 不推荐过度设计,但是写代码后,再多想一下,找找代码坏的味道解决它, 对成长很重要

设计模式的欠缺

结构型-行为型-大部分创建型 都是靠抽象来完成扩展性

因为类是静态的,写好就固定了,想扩展?

只能靠抽象-细节的替换 OOP想扩展,基本都靠抽象---OOP的困境

AOP面向切面编程---可以在不破坏封装的前提下,去扩展通用功能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透:域 Kerberos 认证机制

1. Kerberos 协议简介 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户端/服务器应用程序提供强大的认证服务。 该协议具有以下特点: 去中心化:认证过程独立于主机操作系统,不依赖基于主机地址的信任。安全传输&a…

1961-2022年中国大陆多干旱指数数据集(SPI/SPEI/EDDI/PDSI/SC-PDSI/VPD)

DOI: 10.5194/essd-2024-270 干旱指数对于评估和管理缺水和农业风险至关重要;然而,现有数据集中缺乏统一的数据基础,导致不一致,对干旱指数的可比性提出了挑战。本研究致力于创建CHM_Drought,这是一个创新且全面的长期气象干旱数…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型,它通常以透明的文本或图片形式叠加在页面内容之上,为文档添加标识或信息提示。与传统的静态水印不同,水印注释并不会永久嵌入…

LLVM防忘录

目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…

【双指针】算法题(二)

【双指针】算法题(二) 前言: 这里是几道算法题,双指针说明在上一章。 一、有效三角形的个数 题目链接: 有效三角形的个数 题目叙述: 解法一:暴力循环,叠加三层for循环&#xff0c…

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录:http://192.168.31.135:8086,首次登录设置用户名密码:admin/admin1…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time(默认的时间10秒)参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板,专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块,具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

Linux实验报告14-Linux内存管理实验

目录 一:实验目的 二:实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一:实验目的 (1)掌握内核空间、用户空间&#xff…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签,只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上,增加新字段的需求。 实现方式有: (1&…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中,画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流(程)图 Data Flow Diagram,DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具,可以将…

U盘数据恢复实战指南与预防策略

一、U盘数据恢复初探 U盘数据恢复,简而言之,是指当U盘中的数据因各种原因丢失、损坏或无法访问时,通过特定技术和工具,将丢失的数据重新找回的过程。U盘作为现代生活中不可或缺的便携式存储设备,其数据安全性和稳定性…

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早,赶了个晚集”,用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日,北汽蓝谷新能源科技股份有限公司(SH:600733,简称“北汽蓝谷”)对外披露了子公司北京…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露:理解大型语言模型的参数量级 关键词: #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日,微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient(必要条件)索引库操作1.创建索引库(4步)2.删除索引库(3步)3.判断索引库是否存在(3步)4.总结:四步走 文档操作1.创建文档(4…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

自行下载foremos命令

文章目录 问题描述其他小伙伴的成功解决方案&#xff0c;但对我不适用解决思路失败告终 最终解决成功解决思路解决步骤 问题描述 在kali系统终端中输入foremost&#xff0c;显示无此命令 其他小伙伴的成功解决方案&#xff0c;但对我不适用 解决思路 正常来说使用命令 apt-g…

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…