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

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面向切面编程---可以在不破坏封装的前提下,去扩展通用功能

相关文章:

C# 设计模式概况

什么是设计模式 大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF。总结了在面向…...

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。 随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…...

论文解读之Generative Dense Retrieval: Memory Can Be a Burden

本次论文解读,博主带来生成式稠密检索:记忆可能成为一种负担的论文分享 一、简介 生成式检索根据给定的查询,自回归地检索相关的文档标识符,在小规模的文档库中表现不错,通过使用模型参数记忆文档库,生成…...

RTC:实时时钟

RTC:实时时钟 1、实时时钟2、闹钟中断3、秒中断4、输出功能5、BKP的读写6、BKP的侵入事件 1、实时时钟 ①RTC.c #include "RTC.h"/*** brief:RTC初始化函数*/ RCC_PeriphCLKInitTypeDef RTCPeriphClkInit; //RTC时钟配置结构体 RTC_HandleT…...

mqtt python rtsp拉流图传测试

GitHub - robmarkcole/mqtt-camera-streamer: Stream images from a connected camera over MQTT, view using Streamlit, record to file and sqlite 用这个项目,按照readme配置,把config里面的ip配置成接收端的ip地址。 该装的包装完之后&#xff0c…...

win32汇编环境,对话框程序中通过资源显示bmp图像

;运行效果 ;win32汇编环境,对话框程序中通过资源显示bmp图像 ;通过资源的方式,会把图像固定在exe文件里,会变大。通过读取文件的方式,没有固定在exe文件里,也可以随时换图像文件,所以exe文件较小 ;直接抄进RadAsm可编译…...

《探索人工智能的多元学派:符号主义、连接主义与行为主义》

在人工智能发展的进程中,不同学派从各自的角度诠释着智能的本质。其中符号主义、连接主义和行为主义学派占据着重要地位,它们以独特的方式推动着人工智能的发展。 符号主义学派:逻辑推理的核心 符号主义学派认为人工智能源于对逻辑符号的处…...

2024年终总结及计划

24年收获不少,早就想总结下,但是有的问题不想去思考,也不想去面对,就晚了几天,趁着加班总结反思下。 一、计划完成情况 1、生活 ①运动:继续坚持每周慢跑15公里,这是必须要做的。另外&#x…...

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题:具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系,所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…...

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题…...

STM32-BKP备份寄存器RTC实时时钟

一、原理 Unix: 一些系统是使用32bit有符号数存储,实际范围为-2,147,483,648到2,147,483,647‌即~ 经过计算int32数据会在2038年1月19日溢出,可以看到转换的为北京时间。 STM32的时间戳为无符号时间戳。 我们需要把秒计数器的时间通过计算…...

HTML-文本标签

历史上&#xff0c;网页的主要功能是文本展示。所以&#xff0c;HTML 提供了大量的文本处理标签。 1.<div> <div>是一个通用标签&#xff0c;表示一个区块&#xff08;division&#xff09;。它没有语义&#xff0c;如果网页需要一个块级元素容器&#xff0c;又没…...

香橙派5plus单独编译并安装linux内核无法启动的原因分析与解决记录

1 说明 我依照官方手册编译单独编译linux内核&#xff0c;安装后重启出现内核启动失败的问题,编译和安装步骤如下&#xff1a;# 1. 克隆源码 git clone --depth1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi# 2 配置源码 make rockchip_linu…...

嵌入式应用软件开发中C语言方向面试题

嵌入式应用软件开发中C语言方向面试题随笔 前言一、C语言基础二、嵌入式开发相关三、硬件相关知识五、实际编程问题前言 做嵌入式开发这么多年了,简单记录下C语言方向常见面试题,这里是应用软件方向的。 一、C语言基础 C语言的指针与数组的区别是什么?指针:指针是一个变量…...

linux 系统配置ip

最常见的配置方法是通过 DHCP 获取动态 IP 地址&#xff0c;或者手动配置一个静态 IP 地址。下面我将详细说明这两种常见的配置方法。 通过 DHCP 自动获取 IP 地址 如果你的开发板连接到网络&#xff08;比如通过网线或者 Wi-Fi&#xff09;&#xff0c;并且网络环境支持 DHCP…...

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…...

Tailwind CSS 实战:性能优化最佳实践

在现代网页开发中,性能优化就像是一场精心策划的马拉松。记得在一个电商项目中,我们通过一系列的性能优化措施,让页面加载时间减少了 60%,转化率提升了 25%。今天,我想和大家分享如何使用 Tailwind CSS 进行性能优化。 优化理念 性能优化就像是在打磨一块璞玉。我们需要通过各…...

[redux] useDispatch的两种用法

先重写2个方法先, 方便ts类型推导,如果你看不懂为什么这么写, 先看我这篇 [redux] ts声明useSelector和useDispatch-CSDN博客 export type RootState ReturnType<typeof store.getState>; export type AppDispatch typeof store.dispatch; export const useAppDispat…...

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…...

电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法

一、mfc110.dll文件的重要性 mfc110.dll&#xff0c;全称Microsoft Foundation Class Library 110&#xff0c;是Microsoft Visual C Redistributable for Visual Studio 2012的一部分。这个动态链接库&#xff08;DLL&#xff09;文件对于支持基于MFC&#xff08;Microsoft F…...

Elasticsearch与数据库数据一致性:最佳实践与解决方案

在现代应用程序中&#xff0c;Elasticsearch&#xff08;ES&#xff09;作为一个高效的分布式搜索引擎&#xff0c;常常与数据库一同使用&#xff0c;以提供强大的搜索、分析和数据可视化功能。然而&#xff0c;数据库和Elasticsearch之间的同步与一致性常常成为一个挑战。如何…...

vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)

npm i xlsx-js-style <template><button click"download">下载 Excel 表格</button><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180…...

电子电气架构 --- 中央处理器HPC及软件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

代码实战:基于InvSR对视频进行超分辨率重建

Diffusion Models专栏文章汇总:入门与实战 前言:上一篇博客《使用Diffusion Models进行图像超分辩重建》中讲解了InvSR的原理,博主实测的效果是非常不错的,和PASD基本持平。这篇博客就讲解如何利用InvSR对视频进行超分辨率重建。 目录 环境准备 代码讲解 环境准备...

一文读懂主成分分析法(PCA)

主成分分析法&#xff08;PCA&#xff09; 主成分分析法&#xff08;PCA&#xff09;主成分分析的基本思想主成分的计算主成分分析的原理主成分分析的特点主成分分析的应用 主成分分析法&#xff08;PCA&#xff09; 主成分分析的基本思想 PCA是1901 年Pearson在研究回归分析…...

Redis(基础篇 + 实践篇 )

01 | 基本架构&#xff1a;一个键值数据库包含什么&#xff1f; Redis 作为一个内存数据存储系统&#xff0c;它的架构设计非常简洁&#xff0c;但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构&#xff1a; 客户端通过 TCP 协议连接到 Redis …...

高质量C++小白教程:2.10-预处理器简介

当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。 相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改. 预处理器实际上不会以任何方式修改原始代码文件,预处理…...

一、二极管(模电理论篇)

导论&#xff1a;PN结&#xff08;结电容&#xff09;是构成二极管&#xff0c;三极管&#xff0c;场效应管的原理基础 1.二极管特性&#xff08;单向导电性&#xff09; 1.1 P型半导体与N型半导体 在单晶体硅&#xff08;原子核为正四价电子&#xff0c;可以形成四条共价键&…...

JAVA学习笔记_JVM

文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…...

SQL 中复杂 CASE WHEN 嵌套逻辑优化

目标&#xff1a;优化复杂的 CASE WHEN 逻辑&#xff0c;提升 SQL 语句的可读性与执行效率&#xff0c;减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深&#xff1a;多个条件判断嵌套&#xff0c;难以阅读和维护。重复逻辑&#xff1a;相似逻辑在多个分支中重复…...