面试官:谈谈你知道的设计模式❓

创建型模式🔧

1)单例模式(Singleton)🚩
确保一个类只有一个实例,并提供一个全局访问点。

2)工厂方法模式(Factory Method)🚩
定义一个创建对象的接口,让子类决定实例化哪一个类。
使用场景🚀:当一个类不能预见要创建哪种类的实例时,或者一个类希望由其子类来指定创建的对象时,例如,开发工具中的插件管理器。

3)抽象工厂模式(Abstract Factory)🚩
创建相关或依赖对象的家族,而不需要明确指定具体类。
使用场景🚀:当需要创建一系列相关或相互依赖的对象时,同时又希望隐藏这些对象的具体类时,例如,跨平台的 UI 组件库。

4)建造者模式(Builder)🚩
使用多个简单的对象一步一步构建成一个复杂的对象。
使用场景🚀:当构建一个对象需要很多步骤,这些步骤需要顺序执行,或者构建过程需要多种表示时,例如,组装一台个性化PC。

5)原型模式(Prototype)🚩
通过复制现有的实例来创建新的实例,而不是通过新建类。
使用场景🚀:当创建一个对象比克隆它更昂贵时,或者系统需要独立于其产品创建、组合和表示的方式时,例如,用于恢复历史状态的撤销操作。

结构型模式⛏

1)适配器模式(Adapter)🚩
允许将一个类的接口转换成客户希望的另一个接口。
使用场景🚀:当希望将一个类的接口转换成客户期望的另一个接口,使不兼容的类能一起工作时,例如,集成第三方库或API。

2)桥接模式(Bridge)🚩
将抽象部分与实现部分分离,使它们可以独立变化。
使用场景🚀:当希望将抽象部分与其实现部分分离,使它们可以独立变化时,例如,UI框架中,将抽象的窗口与具体的窗口实现分离。

3)装饰器模式(Decorator)🚩
动态地给一个对象添加一些额外的职责。
使用场景🚀:当需要为对象动态地添加功能,而不改变其结构时,例如,为流添加新的读写功能。

4)组合模式(Composite)🚩
将对象组合成树形结构以表示“部分-整体”的层次结构。
使用场景🚀:当需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,统一地使用组合结构时,例如,图形编辑器中的图形和图形组。

5)外观模式(Facade)🚩
提供一个统一的接口,用来访问子系统中的一群接口。
使用场景🚀:当需要为复杂的子系统提供一个简单的接口时,例如,简化数据库操作的库。

6)享元模式(Flyweight)🚩
通过共享来减少对象的创建,达到减少内存占用的目的。
使用场景🚀:当需要大量的相似对象,且存储成本高昂时,通过共享来减少资源消耗,例如,文字处理软件中的字符对象(Integer 使用了享元模式这个缓存是 -128到 127(包含-128和127)之间的整数)

7)代理模式(Proxy)🚩
为其他对象提供一种代理以控制对这个对象的访问。
使用场景🚀:当需要为另一个对象提供代理或占位符以控制对这个对象的访问时,例如,远程对象访问、延迟初始化、访问控制。

行为型模式🌈

1)责任链模式(Chain of Responsibility)🚩
将请求的发送者和接收者解耦,让多个对象都有机会处理这个请求。
使用场景🚀:当有多个对象可以处理一个请求,而发送者不知道应该由哪个对象处理时,例如,处理审批流程

2)命令模式(Command)🚩
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化。
使用场景🚀:当需要将请求封装为对象,以使用不同的请求、队列或日志请求来参数化其他对象时,例如,实现撤销功能。

3)解释器模式(Interpreter)🚩
给定一个语言,定义它的文法的一种表示,并定义一个解释器。
使用场景🚀:当有一个语言需要解释执行,并且可以将语言中的句子表示为一个抽象语法树时,例如,SQL解析、正则表达式。

4)迭代器模式(Iterator)🚩
提供一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示。
使用场景🚀:当需要提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示时,例如,遍历集合。

5)中介者模式(Mediator)🚩
用一个中介对象来封装一系列的对象交互。
使用场景🚀:当一组对象以定义良好但复杂的方式进行通信,产生了相互依赖的网状结构时,例如,实现MVC框架。

6)备忘录模式(Memento)🚩
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
使用场景🚀:当需要恢复对象到之前的状态(撤销通过rollback实现)而不暴露其内部细节时,例如,编辑器的撤销操作。

7)观察者模式(Observer)🚩
对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。
使用场景🚀:当一个对象状态的改变需要通知其他对象,而又希望这些对象之间是松散耦合的时,例如,实现事件订阅系统。

8)状态模式(State)🚩
允许一个对象在其内部状态改变时改变它的行为。
使用场景🚀:当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为时,例如,线程状态管理。

9)策略模式(Strategy)🚩
定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。
使用场景🚀:当有多种算法相似,客户端希望动态地选择使用哪一种算法时,例如,不同类型的排序算法。

10)模板方法模式(Template Method)🚩
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。
使用场景🚀:当多个子类有共有的方法,并且逻辑基本相同时,把这些逻辑算法放在单一的模板方法中,子类通过实现抽象方法来提供详细的实现,例如,算法的框架。

11)访问者模式(Visitor)🚩
在不改变元素的类的前提下,定义作用于这些元素的新操作。
使用场景🚀:当作用于某对象结构中的各元素的操作需要改变,而对象结构不变时,例如,在不改变集合元素的类的情况下增加新的操作。

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

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

相关文章

YashanDB与帆软信创商业智能软件完成兼容互认证

近日,深圳计算科学研究院崖山数据库系统YashanDB与帆软信创商业智能软件(V6.0)顺利完成兼容性互认证,经严格测试,双方产品能够相互兼容,稳定运行。 崖山数据库系统YashanDB是深圳计算科学研究院自主研发设计…

构建第一个ArkTS应用之@LocalStorage:页面级UI状态存储

LocalStorage是页面级的UI状态存储,通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内,在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器:LocalStorageProp和LocalS…

openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表

文章目录 openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表276.1 现象描述276.2 优化分析openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表 276.1 现象描述 如下简单SQL语句查询, 性能瓶颈点在normal_date的Scan上。 QUERY PLAN ----…

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机?手机环境怎么搭建?这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 : 步骤一:手机调试 苹果手机系统配置推荐:iPhone6S以上,16G。 注意:如果是选择购入二手手机…

指针进阶(三)

嘿嘿,uu们,今天呢我们来剖析指针进阶的剩下部分,好啦,废话不多讲,开干! 1:回调函数 概念:回调函数是指一个通过函数指针调用的函数,如果将函数的地址作为参数传递给另外一个函数,当这个指针被用来调用所指向的函数时,那么这个被调用的函数就是回调函数.回调函数不是由该函数的…

2024年中国AI大模型产业发展报告,洞见下一个智能时代!

人民网财经研究院、至顶科技联合发布的《开启智能新时代:2024年中国AI大模型产业发展报告》,全面梳理了我国AI大模型产业的发展背景、现状、应用案例、面临的挑战以及未来趋势。报告指出,AI大模型是全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎,在我国…

【微磁学3D绘图工具探索】Paraview

文章目录 概要Material Science版块介绍 概要 微磁学中的磁学结构同时包括二维和三维,想要绘制得好看,结果清晰,那么就需要一些自己写的绘图代码之外的额外渲染功能,尤其是对于三维结构的处理,一个好的渲染能够带来很…

如何高效封装App?小猪APP分发平台一站式解决方案

在移动应用开发领域,App封装(App Packaging)是一个至关重要的环节,它不仅关乎应用的安全性,还直接影响到最终用户体验和市场推广策略。本文旨在通过实战指南,揭示如何高效完成App封装,并介绍如何…

微信报名活动链接怎么做

在数字营销日新月异的今天,微信作为拥有数亿用户的社交平台,早已成为品牌宣传的重要阵地。而微信报名活动链接,更是品牌吸引用户参与、提升活动影响力的关键工具。今天,就让我们一起探讨如何制作一个引人入胜的微信报名活动链接&a…

k8s安装(使用kubeadmin安装)

安装方式 使用kubeadmin安装 安装步骤 参考 k8s安装(使用kubeadmin安装)-CSDN博客

信创 | 2023年中国信创产业深度研究报告(完整版)

信创产业研究报告 免责声明:本文资料来源于“第一新声”,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将在第一时间协商版权问题或删除内容! 获取文中相关的PPT资料,请关注文末公众号“程序员…

【JVM】内存结构

内存结构 Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。 线程私有…

Baidu Comate 智能编码助手:编程新伙伴,效率新飞跃

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 写在前面 一、Baidu Comate智能编码助手简介…

STL——deque

双端队列,可以对头端进行插入删除操作 记录一个常遇到的问题 deque subscript out of range 使用了还未定义的空间,大概率是没有初始化就使用了下标或者其他方式进行数据访问。 与vector区别 内部实现方式:deque采用了分段连续存储的方式&…

自己动手写编译器:First 集合,Follow 集合和 Select 集合

在上一节内容,我们手动设计了解析跳转表,表的行对应当前解析堆栈上的非终结符,列对应当前读取的终结符,于是对应的表格数字表示当前应该采取哪个推导表达式。本节我们看看如何自动化构建解析跳转表。首先我们引入一个概念叫 First…

Java代码基础算法练习-年龄问题-2024.05.07

数学家维纳智力早熟,11岁就上了大学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10 个数字正好包含了从0到9这10个数字&#…

mac安装linux的centos strem9 虚拟机解压rar文件报错

背景:解压rar文件需要再linux上安装unrar工具 yum install unrar直接安装的后解压报错,如图 解决办法: 下载:wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2.tar.gz 安装: tar -zxvf rarlinux-x64-6.0.2.tar.gz cd rar …

水力发电乙级资质标准全解读从人员到设备

企业资质要求 独立法人资格:企业必须具有独立的企业法人资格,这是参与市场活动的基础。社会信誉:企业应具有良好的社会信誉,反映其商业道德和市场表现。注册资本:注册资本不少于100万元人民币,确保企业有足…