什么是设计模式?

目录

常见的设计模式

创建型模式

结构型模式

行为型模式

总结


设计模式(Design Pattern)是一些被认为是最佳实践的面向对象编程经验的总结,它们提供了解决特定场景问题的可复用方案。设计模式可以加速开发过程并提高代码质量和可读性,并且是面向对象设计中不可或缺的重要组成部分。

设计模式通常涉及到三个主要元素:类、对象和交互。这些元素被用来解决在软件开发中经常遇到的复杂性问题,包括扩展性、灵活性、可维护性、可重用性等等。

常见的设计模式

 

下面列出了一些常见的设计模式:

创建型模式(Creational Pattern)

创建型模式提供了一种创建对象的方式,从而尽量减少与对象创建相关的问题。这些模式涉及到将对象实例化的过程,并试图将其封装在一个单独的包装器对象中。

  • 工厂模式(Factory pattern):工厂方法模式定义了一个接口或抽象类来创建对象,但让子类决定将哪个类实例化。这样就避免了直接使用 new 关键字来实例化对象,从而让代码更加灵活和可扩展。
  • 抽象工厂模式(Abstract Factory pattern):抽象工厂模式通过提供一个接口,使得客户端不必关心每个对象的创建细节,而只需要知道它们属于同一个工厂即可。抽象工厂模式通常用于创建多个相互依赖的对象系列。
  • 单例模式(Singleton pattern):单例模式确保一个类仅有一个实例,并提供全局访问点。单例模式通常被用来控制资源访问、日志文件管理等系统级别的服务。
  • 建造者模式(Builder pattern):建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式通常用于需要创建多种类型、结构相似但属性不同的对象时。
  • 原型模式(Prototype pattern):原型模式通过复制现有对象来创建新的对象实例,从而避免了在每次创建对象时的代价较高的初始化操作。

创建型模式主要关注于对象的创建过程,通过封装和抽象化的方式来解耦对象的创建和使用。

结构型模式(Structural Pattern)

结构模式关注对象之间的组合或组织方式,以实现更大范围的功能并提供可扩展性和灵活性。

  • 适配器模式(Adapter pattern):适配器模式将一个接口转换成客户端所期望的另一种接口,从而使得原本不兼容的类可以合作无间。
  • 桥接模式(Bridge pattern):桥接模式通过将抽象部分与实现部分分离,让它们可以独立地变化。该模式通常用于需要支持多种平台、数据库等不同类型的变化时。
  • 组合模式(Composite pattern):组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,并让客户端统一对待单个对象和对象组合。
  • 装饰者模式(Decorator pattern):装饰者模式动态地为对象添加新的功能,通过使用一系列装饰器来透明地修改对象的行为。
  • 外观模式(Facade pattern):外观模式提供了一个简化的接口,以便客户端可以更容易地使用复杂的子系统。
  • 享元模式(Flyweight pattern):享元模式通过共享大量细粒度对象,以达到减少内存使用和提高性能的目的。
  • 代理模式(Proxy pattern):代理模式为其他对象提供一种代理以控制对这个对象的访问。代理是一个包装器或代理对象,它可以在不改变原始对象的情况下控制其访问。

结构型模式关注于对象之间的组织方式,包括如何将对象组合在一起以形成更大的结构,并提供了可扩展性和灵活性。

行为型模式(Behavioral Pattern)

行为型模式是一类用于协调对象之间通信和控制对象交互的设计模式。这些模式强调对象间的交互和职责分配,以实现更好的灵活性和可扩展性。

  • 职责链模式(Chain of responsibility pattern):职责链模式将请求沿着一个处理链传递,直到能够处理该请求的对象被找到。通过使用职责链模式,可以避免发送者和接收者之间的耦合关系。
  • 命令模式(Command pattern):命令模式将请求封装成一个对象,从而使得请求可以像对象一样被传递、存储和调用。通过使用命令模式,可以在不同的请求发起者和请求接收者之间解耦。
  • 解释器模式(Interpreter pattern):解释器模式定义了一种语言和它的文法,并使用该语言来解释和执行特定的操作。通常情况下,该模式用于编写编译器或解释器的设计。
  • 迭代器模式(Iterator pattern):迭代器模式提供一种顺序访问集合对象中各个元素的方法,而又不暴露该集合对象的内部表示。通过使用迭代器模式,可以将职责分配给多个类,从而实现更好的灵活性和可扩展性。
  • 中介者模式(Mediator pattern):中介者模式定义了一个对象,用来封装一组对象之间的交互方式。通过使用中介者模式,可以减少对象之间的直接耦合关系,并降低系统的复杂度。
  • 备忘录模式(Memento pattern):备忘录模式提供了一种无需破坏封装的方式,让对象的状态可以被保存和恢复。通过使用备忘录模式,可以在不影响对象本身的前提下,对其状态进行操作。
  • 观察者模式(Observer pattern):观察者模式定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
  • 状态模式(State pattern):状态模式允许对象在其内部状态发生改变时改变其行为。通过使用状态模式,可以将复杂的、与状态相关的条件语句重构为具有明确状态变量的对象。
  • 策略模式(Strategy pattern):策略模式允许程序动态地改变算法或策略,而无需改变调用方的代码。通过使用策略模式,可以使对象在运行时选择算法,从而提高程序的灵活性和可扩展性。
  • 模板方法模式(Template method pattern):模板方法模式定义了一种算法框架,在其中某些步骤由子类实现。通过使用模板方法模式,可以减少重复的代码,并且允许子类根据需要改变算法中的某些步骤。
  • 访问者模式(Visitor pattern):访问者模式允许程序为不同类型的对象定义一个新的操作,而无需更改这些对象的类或接口。通过使用访问者模式,可以将数据结构与对其上执行的操作分离开来。

行为型模式关注于对象之间的交互和通信方式,它们描述了如何在不同种类的对象之间传递消息、协调工作以及管理状态转换等问题。

总结

设计模式在软件开发中扮演着非常重要的角色。

  1. 提高代码质量和可读性 设计模式可以帮助开发人员遵循面向对象编程的最佳实践,从而提高代码质量和可读性。采用设计模式可以使代码更加模块化、易于测试和维护。

  2. 增加复用性和灵活性 设计模式可以提供可复用的解决方案,避免开发人员在每个项目中都重新发明轮子。此外,它们还为开发人员提供了一种灵活的方式来对变化做出响应,从而增加了软件系统的灵活性和扩展性。

  3. 促进团队协作 设计模式提供了一个共同的词汇和架构,使得整个团队可以更好地理解和交流彼此之间的想法和代码。这种统一的视角和语言有助于提高团队整体的效率和合作力。

  4. 节约时间和成本 使用设计模式可以大大节约开发时间和成本。由于设计模式是被广泛接受并经过验证的最佳实践,因此它们已经过多次实践,可以使开发人员快速找到适当的解决方案并快速实现软件系统。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GFD233A 3BHE022294R0103

GFD233A 3BHE022294R0103 ABB KUC321AE PLC模块 HIEE300698R0001 KU C321 AE01 ABB KUC711 3BHB004661R0001 高压变频模块 KUC711AE ABB KUC755AE105 3BHB005243R0105 驱动控制系统模块 KUC755 ABB KUC755AE106 3BH005243R006 控制系统模块 KU C755 AE 106 ABB LDGRB-01 3BSE01…

【C语言】基础语法1:变量和数据类型

下一篇:运算符和表达式 ❤️‍🔥前情提要❤️‍🔥   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…

知乎版ChatGPT「知海图AI」加入国产大模型乱斗,称效果与GPT-4持平

“2023知乎发现大会”上,知乎创始人、董事长兼CEO周源和知乎合作人、CTO李大海共同宣布了知乎与面壁智能联合发布“知海图AI”中文大模型。 周源据介绍,知乎与面壁智能达成深度合作,共同开发中文大模型产品并推进应用落地。目前,知…

vue 报错 error:03000086:digital envelope routines::initialization error解决方案

目录 1. 引言: 2. 更换版本出现问题: 3. 出现原因: 4. 解决办法: -> 4. 1 删了 再换回16.15版本 -> 4.2 指令修改(好使) ---> 4.2.1效果如图 -> 4.3 其他指令就别试了 压根不好使 1. 引言: npm出现问题 , 卸载后 装了个新node 18.15版本 2. 更换版本…

JavaScript【三】JavaScript中的数组

文章目录 🌟前言🌟数组🌟声明:🌟 隐式创建:🌟 实例化构造函数: 🌟 注意:一个值为数组的长度。🌟 访问:🌟 遍历&#xff1a…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Eureka、Ribbon)

微服务技术栈导学 微服务技术是分布式架构(把服务做拆分)的一种 而springcloud仅仅是解决了拆分时的微服务治理的问题,其他更复杂的问题并没有给出解决方案 一个完整的微服务技术要包含的不仅仅是springcloud 微服务技术栈 包括什么 …

深度学习中的各种不变性

不变性 平移不变性(Translation Invariance)旋转不变性(Ratation Invariance)尺度不变性(Size Invariance)光照不变性(Illumination Invariance)仿射不变性(Affine Invar…

springcloud2.1.0整合seata1.5.2+nacos2.10(附源码)

springcloud2.1.0整合seata1.5.2nacos2.10(附源码) 1.创建springboot2.2.2springcloud2.1.0的maven父子工程如下,不过多描述: 搭建过程中也出现很多问题,主要包括: 1.seataServer.properties配置文件的组…

第二部分——长难句——第一章——并列句

conjunction(and,but,if,when(while)) 想把两个句子(多件事)连在一块,就必须加上连词。 所以长难句到底是啥? 所以长难句(直白表达,并不是语法表述)就是几个简单句多家上几个连接词就齐活了&am…

【vue2】使用vue-admin-template动态添加路由的思路/addRoutes的使用

😉博主:初映CY的前说(前端领域) ,📒本文核心:用原生js实现省市区联动 【前言】在通用的后台管理项目的开发中,不仅仅是会涉及到对表单数据等的增删改查操作还会涉及到一些关于权限管理的问题。我们将基于一个RBAC的思维…

C++STL大全----容器篇(上)

(一)概念 STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。…

2023-04-21 学习记录--C/C++-实现升序降序(冒泡法/沉底法)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、冒泡法(沉底法) —— 升序 ⭐️ (一)、思路 从左到右: 1、第一个与第二个比较&#xff0…

RK3568平台开发系列讲解(调试篇)IS_ERR函数的使用

🚀返回专栏总目录 文章目录 一、IS_ERR函数用法二、IS_ERR函数三、内核错误码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 IS_ERR 函数的使用。 一、IS_ERR函数用法 先看下用法: 二、IS_ERR函数 对于任何一个指针来说,必然存在三种情况: 一种是合…

微信小程序开发(学习记录1.0)

首先,把遇到的问题贴出来,主要是这个解决问题的思路,供大家参考。 现在的问题是将下面的导航栏做出来,但是在自己做的时候 遇到的问题 在app.json文件中输入tarBar,就会生成模板代码,默认会生成一个list的模…

树莓派 QT项目开机自启动

我自己用qt设置了一个界面,如何让他开机自启动呢? 目录 1.生成qt项目的可执行文件 2. 编写一个自启动脚本 3.重启树莓派 1.生成qt项目的可执行文件 QT项目的可执行文件就是.exe文件。首先在qt中打开,点击红色方框图标,选择Re…

Oracle函数记录

一、各个函数介绍 1.OVER(PARTITION BY… ORDER BY…)--开窗函数 1.开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组 值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一…

软件测试?月薪20k+?不会自动化测试的我真的很难....

做自动化测试后悔吗? 后悔,真的后悔! 后悔没有早点学..... 虽然现在网上到处都在散播35的焦虑,姑且信之,那么反问你,如果你30岁了,那么给你5年,能够在某个领域成为专家呢&#xf…

《花雕学AI》ChatGPT跟人类的思考方式有什么不同?

一、ChatGPT是一个基于GPT-3.5的对话语言模型,它可以根据用户的输入生成多轮对话,也可以生成文本、代码、音乐等内容。ChatGPT的思考方式是利用大量的数据和强大的算力来学习语言的联合概率分布,从而能够根据上下文和目标生成合理和有趣的回复…

python文本自动伪原创-ai一键伪原创

chatgpt批量伪原创的优势 ChatGPT是一个由OpenAI开发的强大的自然语言处理模型,它具有批量伪原创的优势,以下是这些优势: 模型能够处理大量的数据:ChatGPT通过训练大规模的语言模型来生成伪原创文本。这个模型拥有一个庞大的语料…

GaussDB工作级开发者认证—第二章GaussDB数据库应用程序开发指引

一. 驱动概述 GaussDB客户端接入认证,GaussDB支持以下三种认证方式:基于主机的认证口令认证SSL加密 二. JDBC接口介绍 1. JDBC概述 Java数据库连接(JDBC)是Java标准,它提供了从Java连接到关系数 据库的接口&#x…