当前位置: 首页 > 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…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...