设计模式的种类及其应用场景

设计模式可以大致分为以下几类:创建型模式、结构型模式和行为型模式。每一类设计模式都有其独特的特点和应用场景。下面我将对这三类设计模式进行详细说明,并介绍它们各自的应用场景。

创建型模式

创建型模式 关注对象的创建过程,它抽象了实例化过程,帮助我们在创建对象时无需直接使用 new 关键字,降低了系统的耦合度。

  1. 单例模式(Singleton Pattern)
    • 描述:确保一个类只有一个实例,并提供一个全局访问点。
    • 应用场景:当频繁实例化并且创建的对象消耗很多资源时,如数据库连接池、日志记录器等。
  2. 工厂模式(Factory Pattern)
    • 描述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    • 应用场景:当创建对象时不想直接使用 new 关键字,而是想将对象的创建与使用相分离时。
  3. 抽象工厂模式(Abstract Factory Pattern)
    • 描述:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
    • 应用场景:当需要创建的对象之间存在关联或依赖关系时,如UI工具包中的按钮、文本框等组件的创建。
  4. 建造者模式(Builder Pattern)
    • 描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 应用场景:当需要创建一个复杂对象,该对象的构建过程允许有不同的表示时,如配置文件的生成、SQL语句的构造等。
  5. 原型模式(Prototype Pattern)
    • 描述:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
    • 应用场景:当创建对象的成本较大(如初始化需要占用较多资源)时,或者当需要频繁创建具有相同或相似状态的对象时。

结构型模式

结构型模式 关注类和对象的组合,它采用继承以外的方法来组合对象,从而获得更大的灵活性。

  1. 适配器模式(Adapter Pattern)
    • 描述:将一个类的接口转换成客户端所期待的另一种接口,从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。
    • 应用场景:当需要使用现有的类,但接口不符合要求时,或者当需要重用一些已存在的子类,但子类无法直接继承时。
  2. 桥接模式(Bridge Pattern)
    • 描述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
    • 应用场景:当抽象和实现之间有明显的界限,且抽象和实现都需要独立变化时。
  3. 组合模式(Composite Pattern)
    • 描述:将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户对单个对象和复合对象的使用具有一致性。
    • 应用场景:当需要表示对象的部分-整体的层次结构时,或者当需要让客户端忽略复合对象和单个对象的区别时。
  4. 装饰器模式(Decorator Pattern)
    • 描述:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。
    • 应用场景:当需要动态地给一个对象添加功能,并且这些功能可以撤销时。
  5. 外观模式(Facade Pattern)
    • 描述:为子系统中的一组接口提供一个统一的接口,降低系统的复杂性。
    • 应用场景:当系统需要向客户端提供一个简单、一致的接口,以隐藏系统的复杂性时。

行为型模式

行为型模式 关注对象之间的通信和职责分配,它描述对象之间的交互模式以及分配职责。

  1. 观察者模式(Observer Pattern)
    • 描述:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。
    • 应用场景:当对象之间需要保持一种一对多的依赖关系时,如GUI组件、订阅-发布系统等。
  2. 策略模式(Strategy Pattern)
    • 描述:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。
    • 应用场景:当需要在多种算法间进行选择和使用时,如排序算法、支付方式等。
  3. 模板方法模式(Template Method Pattern)
    • 描述:定义了一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可

后续会持续更新分享相关内容,记得关注哦!

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

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

相关文章

更新pip版本(在自己工程中的虚拟环境中)

D:\Program\PycharmProjects\guangdongprecipitation.venv\Scripts\python.exe -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple D:\Program\PycharmProjects\guangdongprecipitation.venv\Scripts指的是属于guangdongprecipitation工程的python解释…

C# WPF入门学习主线篇(十八)—— Border布局容器

C# WPF入门学习主线篇(十八)—— Border布局容器 欢迎来到C# WPF入门学习系列的第十八篇。在前几篇文章中,我们已经探讨了 Canvas、StackPanel、WrapPanel、DockPanel、Grid 和 UniformGrid 布局容器及其使用方法。本篇博客将介绍另一种非常…

Secure Boot 与 Android Verified Boot (AVB) 之间的关系与差异点

标签: Secure Boot; AVB;Android Secure Boot 与 Android Verified Boot (AVB) 的关系、相同点和差异点 概述 Secure Boot 和 Android Verified Boot (AVB) 都是用于保护设备启动过程和操作系统完整性的安全技术。虽然它们在设计和实现上有不同的重点和方式,但它们的共同…

【冲刺秋招,许愿offer】第 二 天

【冲刺秋招,许愿offer】第 二 天 知识点每天emo小tips 知识点 final不可变性的原理 可见性:当一个共享变量被声明为final时,每个线程都能看到这个变量的最新值。这是因为final变量的读取操作会直接从主内存中获取值,而不是从线程…

简单介绍一下vim

简单介绍一下vim 一、vim是什么?二、vim的优点三、vi/vim的使用命令模式输入模式底线命令模式 四、vi/vim 按键说明(一)命令模式可用的光标移动、复制粘贴、搜索替换等移动光标的方法:搜索替换的方法删除、复制与贴上的方法 (二&a…

【算法】常用排序算法(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)超详细

排序算法是数据结构相关知识中非常重要的一节,相信很多小伙伴对这部分知识一知半解。那么接下来,小编就要带领大家一起来进行对排序算法的深入剖析学习,希望本篇文章能够使你有所收获! 一.常见的排序算法 排序算法有很多种&#…

Apache Spark MLlib机器学习详解

Apache Spark MLlib 是 Spark 的一个核心组件,用于提供可扩展的机器学习算法库。MLlib 包含了各种常见的学习算法和实用程序,如分类、回归、聚类、协同过滤、降维等,以及底层的优化原语和高层次的管道API。 以下是关于 Spark MLlib 的一些关…

LINUX网络FTP服务

一、FTP服务 FTP服务:file transfer protocol :文件传输协议。在网络上进行双向传输,也是一个应用程序。不同的操作系统有不同的FTP软件,但使用的协议是一样的。 FTP协议基于TCP协议,有两个端口,即20和21。 20端口&…

基于xml的Spring应用(理解spring注入)

目录 问题: 传统Javaweb开发的困惑? 问题: IOC、DI和AOP的思想提出 问题: Spring框架的诞生 1. BeanFactory快速入门 2. ApplicationContext快速入门 3. BeanFactory和ApplicationContext的关系 基于xml的Spring应用 1. SpringBean的…

jmeter性能优化之mysql配置

一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时&…

Java入门基础11:面向对象高级一(static、extends继承)

Java面向对象高级特性有以下几个:继承,多态,封装,抽象,接口,匿名内部类,静态成员,final关键字,异常处理等。 我会将它分为三章详细讲,本章主要讲静态和继承 …

算法导论实战(六)(算法导论习题三十四、三十五章)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀算法启示录 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 前言 算法导论的知识点学习将持续性更新在算…

第十四周 6.4 内部类部分知识点

一、理解 1.定义在一个类内部的类称为内部类 2.语法: class 类名{ class 类名{} } 3.内部类编译之后生成独立的.class文件,文件命名为:外部类类名$内部类的类名.class 4.内部类分类:成员内部类、静…

初阶 《函数》 2.C语言中函数的分类

2.C语言中函数的分类 1.库函数 2.自定义函数 2.1 库函数 为什么会有库函数? 1.我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能…

Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路

目录 写在前面Nginx04LNMP流程详解Nginx处理静态资源流程Nginx处理动态资源流程 LNMP排错LinuxNginxPHPMysql Nginx 代理概述正向代理反向代理区别 反向代理实验(Proxy模块)环境准备front配置lb01配置测试流程梳理总结 写在前面 这是Nginx第四篇&#xf…

JWT不是为了授权而设计的

JWT不是为了授权而设计的,只是用作身份验证。 JWT 主要用于验证身份。由于大多数开发人员不会开发自己的身份验证解决方案,因此身份验证提供商的 SDK 可能会为您完成此操作。您最终从 JWT 获得的是身份本身。 这很好,因为 JWT 是可验证的用…

Follow Carl To Grow|【LeetCode】669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树

【LeetCode】669. 修剪二叉搜索树 题意:给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有…

生成隐藏图

什么是隐藏图?请在手机版小红书上打开此链接双指放大图片观看。 本人还写了一个QT程序,可以通过傻瓜式操作生成隐藏图,有兴趣可以自行体验。 主要就是根据透明度展示原理去针对一个通道列方程,然后发现把前景图的色值全部映射到 1…

【Linux】 安装rz 和sz

在 Linux 系统中,rz 和 sz 是两个用于在本地计算机与远程计算机之间安全传输文件的命令行工具。它们是 lrzsz 包的一部分,通常用于通过 SSH 连接传输文件。 打开终端: 首先,打开你的 CentOS 机器上的终端。 执行sz 提示下面信息…

王学岗鸿蒙开发(北向)——————(七、八)ArkUi的各种装饰器

arts包含如下:1,装饰器 ;2,组件的描述(build函数);3,自定义组件(Component修饰的),是可复用的单元;4,系统的组件(鸿蒙官方提供);等 装饰器的作用:装饰类、变量、方法、结…