整理好了!2024年最常见 20 道设计模式面试题(二)

上一篇地址:整理好了!2024年最常见 20 道设计模式面试题(一)-CSDN博客

三、解释工厂方法模式和抽象工厂模式的区别。

工厂方法模式和抽象工厂模式都是创建型设计模式,它们用于创建对象,但它们在应用场景和实现方式上存在一些关键的区别。

工厂方法模式(Factory Method Pattern)

工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。

特点:

  • 定义了一个创建对象的接口。
  • 让子类决定实例化哪一个类。
  • 封装了对象的创建过程。

适用场景:

  • 当需要创建的对象类型较多,且这些对象具有共同的接口或抽象类时。
  • 当需要将对象的创建和使用分离,以提高灵活性和可扩展性。

实现方式: 工厂方法模式通常包含以下几个角色:

  • 产品(Product):定义了产品的接口。
  • 具体产品(Concrete Product):实现产品接口的具体类。
  • 工厂(Creator):定义了创建产品的接口。
  • 具体工厂(Concrete Creator):实现工厂接口,具体实例化某个产品。

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个接口,用于创建一系列相关或依赖对象的家族,而不需明确指定具体类。

特点:

  • 创建一系列相关或依赖的产品对象。
  • 封装了产品系列的创建过程。
  • 允许系统独立于产品的实现。

适用场景:

  • 当需要创建的产品族具有多个等级结构时。
  • 当系统需要提供相同类型的产品族,但具体类型在运行时才确定时。

实现方式: 抽象工厂模式通常包含以下几个角色:

  • 抽象产品(Abstract Product):定义了产品的接口。
  • 具体产品(Concrete Product):实现抽象产品的接口。
  • 抽象工厂(Abstract Factory):提供了创建抽象产品的接口。
  • 具体工厂(Concrete Factory):实现抽象工厂的接口,具体实例化某个产品族。

区别:

  1. 产品结构:工厂方法模式创建单一产品,而抽象工厂模式创建产品族。
  2. 工厂结构:工厂方法模式只有一个工厂类,而抽象工厂模式有多个工厂类,每个工厂类负责创建一个产品族。
  3. 扩展性:工厂方法模式易于添加新的产品,但增加新的产品等级结构需要修改工厂类;抽象工厂模式易于添加新的产品等级结构,但增加新的产品需要修改所有的工厂类。
  4. 复杂性:工厂方法模式相对简单,适用于产品结构单一的情况;抽象工厂模式适用于产品结构复杂,需要创建多个相关产品的情况。

示例:

假设我们有一个软件系统,需要创建不同类型的图形对象,如圆形和矩形。

  • 工厂方法模式:我们可以有一个Shape接口和两个具体类CircleRectangle。然后,我们有一个ShapeFactory接口和两个具体工厂类CircleFactoryRectangleFactory,每个工厂类分别创建一个形状。

  • 抽象工厂模式:如果我们的系统需要同时创建颜色和形状,我们可以定义一个Color接口和Shape接口,以及它们的具体实现。然后,我们有一个AbstractFactory接口,它包含创建颜色和形状的方法。具体工厂类如RedCircleFactoryBlueRectangleFactory实现这个接口,分别创建红色圆形和蓝色矩形。

通过这种方式,工厂方法模式和抽象工厂模式提供了灵活和可扩展的方式来创建对象,适应不同的设计需求。

四、描述建造者模式,并给出一个使用场景。

建造者模式(Builder Pattern)是一种对象创建的设计模式,用于构建一个复杂对象。它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出不同表示的对象。

建造者模式的关键特点:

  1. 复杂对象的构建:用于创建具有多个属性和配置的复杂对象。
  2. 分步骤构建:对象的构建过程被分解成多个步骤,逐步构建。
  3. 灵活性:允许在构建过程中修改构建步骤,以创建不同的对象表示。
  4. 封装性:隐藏了对象构建的细节,只暴露构建完成的对象。

建造者模式的角色:

  1. 产品(Product):最终创建的对象。
  2. 建造者(Builder):创建产品对象的接口,定义创建产品的方法。
  3. 具体建造者(Concrete Builder):实现建造者接口,具体构建产品的方法。
  4. 指挥者(Director):管理建造过程,调用建造者的方法来创建产品。

使用场景:

建造者模式适用于以下场景:

  • 对象的构建过程复杂,涉及多个步骤。
  • 对象的构建过程可能会变化,需要灵活性。
  • 需要创建具有不同属性或配置的多种复杂对象。

示例使用场景:汽车制造

假设我们正在设计一个汽车制造系统,汽车由多个部件组成,如发动机、轮胎、车身等。使用建造者模式,我们可以定义一个Car类作为产品,一个CarBuilder接口作为建造者,以及具体的建造者实现,如EconomyCarBuilderLuxuryCarBuilder

示例代码(Java):

// 产品角色:汽车
interface Car {void setEngine(String engine);void setWheels(String wheels);void setBody(String body);// 省略其他部件设置方法
}// 具体产品:经济型汽车
class EconomyCar implements Car {private String engine;private String wheels;private String body;// 实现方法
}// 具体产品:豪华型汽车
class LuxuryCar implements Car {private String engine;private String wheels;private String body;// 实现方法
}// 建造者角色:汽车建造者接口
interface CarBuilder {void setEngine();void setWheels();void setBody();// 省略其他部件设置方法Car getCar();
}// 具体建造者:经济型汽车建造者
class EconomyCarBuilder implements CarBuilder {private Car car;public EconomyCarBuilder() {this.car = new EconomyCar();}public void setEngine() {// 设置经济型发动机}public void setWheels() {// 设置经济型轮胎}public void setBody() {// 设置经济型车身}public Car getCar() {return car;}
}// 指挥者角色:汽车制造指挥者
class CarDirector {public Car constructCar(CarBuilder builder) {builder.setEngine();builder.setWheels();builder.setBody();// 调用其他设置方法return builder.getCar();}
}// 使用建造者模式创建汽车
public class BuilderPatternDemo {public static void main(String[] args) {CarBuilder builder = new EconomyCarBuilder();CarDirector director = new CarDirector();Car car = director.constructCar(builder);// 使用car}
}

在这个示例中,CarDirector类作为指挥者,通过调用CarBuilder接口定义的方法来构建汽车。EconomyCarBuilderLuxuryCarBuilder作为具体建造者,实现了不同的汽车构建逻辑。这样,我们可以灵活地创建不同类型的汽车,而不需要修改构建逻辑。

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

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

相关文章

Avalonia for VSCode

1、在VSCode中编辑AvaloniaUI界面,在VSCode中搜索Avalonia,并安装。如下图,可以发现Avalonia for VSCode还是预览版。 2、 创建一个Avalonia 项目。 选择项目类型 输入项目名称 选择项目所在文件夹 打开项目 3、项目架构如下图。 4、builde…

WPF 布局控件 Grid表格

介绍 Grid表格布局控件,在WPF项目的界面布局中非常常用。主要是以行列进行元素控制的。 常用的属性 Grid.Row: 指定子元素所在的行。 Grid.Column: 指定子元素所在的列。 Grid.RowSpan 跨几行 Grid.ColumnSpan 跨几列 RowSpacing:…

敏捷测试:方法和实践

敏捷测试:方法和实践 前言1. 敏捷团队组织构成与任务2. 测试驱动开发(TDD)3. 递增型迭代测试模型4. 静态测试的重要性5. 测试计划与管理6. 敏捷测试活动时间表结论 前言 敏捷测试的实践是将敏捷开发原则和方法运用到测试过程中,以…

ICBINP - “I Can‘t Believe It‘s Not Photography“

ICBINP - “I Can’t Believe It’s Not Photography” 推荐设置: DPM 3M SDE Karras or DPM 2M Karras, 20-30 steps, 2.5-5 CFG (or use Dynamic Thresholding), happiest at 640x960 with a hires fix on top, but if you are happy to hunt through seeds to a…

汇聚荣拼多多运营策略是怎么样的?

拼多多作为中国领先的电商平台,其运营策略一直备受关注。拼多多的成功不仅在于其创新的“社交电商”模式,更在于其精细化的市场定位和高效的用户增长策略。本文将深入分析拼多多的运营策略,探讨其如何在激烈的电商竞争中突围而出。 一、用户增…

基于Java的度分秒坐标转纯经纬度坐标的漂亮国基地信息管理

目录 前言 一、空间表设计 1、物理表结构 二、后台数据管理 1、数据去重 2、去重的具体实现 3、度分秒数据格式转换 4、具体的转换方法 5、新增界面的实现 三、数据管理界面 总结 前言 众所周知,漂亮国在全球范围内部署了大量的基地,用以维持其…

Unity OpenCVForUnity 安装和第一个案例详解 <一>

目录 一、资源简介 二、安装使用 1.下载案例Demo 2.移动StreamingAssets文件夹 3.添加场景 三、今日案例 1.案例Texture2DToMat Example 2.什么是Mat? 3.如何把Texture2D变成Mat (1).初始化Mat (2).Cv_…

React如何配置路由

ReactTs配置路由 安装依赖 npm i react-router-dom在routers下面创建index.tsx import { RouteObject } from react-router-dom import React from react import PageA from /views/PageA import PageB from /views/PageB const routes: RouteObject[] [{path: /,element: …

Bagging与Boosting的应用与优势

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

【最全面最优质的PyTorch学习资源】

纯 PyTorch 资源 PyTorch 博客 https://pytorch.org/blog/ PyTorch 文档 https://pytorch.org/docs PyTorch 性能调优指南 https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html# PyTorch Recipes https://pytorch.org/tutorials/recipes/recipes_index.h…

项目管理进阶之EVM(挣值管理)

前言 项目管理进阶系列,终于有时间更新啦!!!欢迎持续关注哦~ 上一节博主重点讲了一个环:PDCA,无论各行各业,上到航空航天、下到种地种菜,都离不开对质量的监督和改进。这个环既是一…

面试题:script标签中 defer(延迟)和 async(异步) 有啥区别?(他们只对外部脚本有效)

defer脚本即使下载完成,也会被延迟到整个页面都解析完毕后再运行,运行结束后触发DOMContentLoaded事件。” “而async脚本下载完成后立即执行,可能会在 DOMContentLoaded之前或之后,保证在页面的 load 事件前执行

MyBatis 关于查询语句上配置的详细内容

1. MyBatis 关于查询语句上配置的详细内容 文章目录 1. MyBatis 关于查询语句上配置的详细内容2. 准备工作3. SQL查询结果&#xff0c;返回为POJO实体类型4. SQL查询结果&#xff0c;返回为List<POJO\> 集合类型5. SQL查询结果&#xff0c;返回为Map 集合6. SQL查询结果&…

洗地机性价比高的是哪一款?行内人告诉你

在浏览前&#xff0c;希望您轻触屏幕上方的“关注”按钮&#xff0c;让我后续为您带来更多实用且精彩的内容&#xff0c;感谢您的支持&#xff01; 洗地机作为现在的流行清洁工具&#xff0c;它的魅力之处在于&#xff1a;性价比极高&#xff0c;大多数家庭无需花费过多就能把…

IPNV6写法

黄色---一致 红色---取消 V4中的第二列用于分片 V6可以使用扩展首部实现 蓝色--替代 1、服务类型--扩展表 2、报头长度---有效负载长度 3、TTL--跳数限制 4、协议号---下一个头…

英伟达开源 3400 亿参数模型;苹果 iOS 18 紧急 SOS 新增实时视频功能丨 RTE 开发者日报 Vol.225

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

力扣172. 阶乘后的零

Problem: 172. 阶乘后的零 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.要使得末尾出现0&#xff0c;则乘式中必须出现因子2与5&#xff1b; 2.而由于对于一个数的阶乘&#xff0c;易知因子2的个数是大于因子5的个数&#xff08;因为只要出现偶数则可以分解出…

vscode c++ 开发环境配置

今天各位同学已经安装了mingw环境&#xff0c;但部分同学vscode开发环境又问题&#xff0c;究其原因&#xff0c;还是vscode 编译环境配置错误&#xff0c;有问题的同学 按如下步骤处理&#xff1a; 1、卸载相关插件&#xff0c;特别是中文插件&#xff0c;原因是暂时回避中文…

C++语法14 双分支结构 if…else语句和逻辑运算符

什么是双分支结构&#xff1f; 双分支&#xff1a;有两条路&#xff0c;而且这两条路都可以选择。如果满足判断条件&#xff0c;就执行语句1&#xff0c;不满足就执行语句2。 双分支结构基本框架 if(条件表达式) //如果条件成立 {语句1&#xff1b; //条件真时执行} els…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串筛选排序(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…