赶紧收藏!2024 年最常见 20道设计模式面试题(三)

2024-06-19 04:36

本文主要是介绍赶紧收藏!2024 年最常见 20道设计模式面试题(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇地址:赶紧收藏!2024 年最常见 20道设计模式面试题(二)-CSDN博客

五、建造者模式:建造者模式如何解决复杂对象的构建问题?

建造者模式(Builder Pattern)是一种对象创建型设计模式,用于解决复杂对象的构建问题。它允许通过逐步构建一个复杂对象来分离对象的构建过程和表示,使得相同的构建过程可以创建不同的表示。

建造者模式的主要角色:

  1. 建造者(Builder):定义创建复杂对象的接口。
  2. 具体建造者(ConcreteBuilder):实现建造者接口,构建并提供最终的对象。
  3. 导演者(Director):负责使用建造者来创建对象的步骤。
  4. 产品(Product):复杂对象的抽象类,定义了产品的属性和行为。
  5. 具体产品(ConcreteProduct):实现产品接口的具体类,是构建过程产生的最终对象。

建造者模式如何解决复杂对象的构建问题:

  1. 分离构建和表示:建造者模式将对象的构建过程和最终表示分离开来,使得构建过程可以在不影响表示的情况下独立变化。

  2. 控制复杂性:通过逐步构建对象,可以控制复杂对象的构建过程,避免使用大量的参数来创建对象。

  3. 增加灵活性:建造者模式允许通过相同的构建过程来创建不同的产品,增加了对象构建的灵活性。

  4. 避免使用复杂的构造函数:在没有建造者模式的情况下,创建复杂对象可能需要一个包含多个参数的构造函数,这使得代码难以理解和维护。

  5. 支持不变的对象:建造者模式可以创建不可变对象,因为对象的构建过程是逐步进行的,一旦构建完成,对象的状态就固定了。

实际应用场景:

  1. 汽车制造:在汽车制造过程中,可以使用建造者模式来逐步添加汽车的各个部件,如引擎、轮胎等。

  2. 文档编辑:在文档编辑软件中,可以使用建造者模式来逐步构建文档的不同部分,如标题、段落、图片等。

  3. 复杂图形界面的构建:在图形界面的构建过程中,可以使用建造者模式来逐步添加组件,如按钮、文本框等。

示例代码(Java):

// 产品接口
interface Product {void show();
}// 具体产品
class Computer implements Product {private String cpu;private String ram;private String hdd;// 省略构造函数、getter和setter@Overridepublic void show() {System.out.println("CPU: " + cpu + ", RAM: " + ram + ", HDD: " + hdd);}
}// 建造者接口
interface Builder {void setCPU(String cpu);void setRAM(String ram);void setHDD(String hdd);Product getProduct();
}// 具体建造者
class ComputerBuilder implements Builder {private Computer computer = new Computer();@Overridepublic void setCPU(String cpu) {computer.setCpu(cpu);}@Overridepublic void setRAM(String ram) {computer.setRam(ram);}@Overridepublic void setHDD(String hdd) {computer.setHdd(hdd);}@Overridepublic Product getProduct() {return computer;}
}// 导演者
class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public Product construct() {builder.setCPU("i7");builder.setRAM("16GB");builder.setHDD("1TB");return builder.getProduct();}
}// 客户端代码
public class Client {public static void main(String[] args) {Director director = new Director(new ComputerBuilder());Product product = director.construct();product.show();}
}

在这个示例中,Computer是具体产品,Builder是建造者接口,ComputerBuilder是具体建造者,实现了建造者接口并构建Computer对象。Director是导演者,负责调用建造者的方法来构建产品。客户端代码演示了如何使用建造者模式来创建一个Computer对象。通过建造者模式,我们可以清晰地看到对象的构建过程,并且可以轻松地扩展或修改构建过程。

六、原型模式:请描述原型模式的工作原理及其适用场景。

原型模式(Prototype Pattern)是一种创建型设计模式,它使用原型实例指定创建对象的种类,并通过复制这些原型来创建新的对象。这种模式允许一个类的实例创建一个或多个它的克隆,而不需要知道这些实例的类是如何构建的。

原型模式的工作原理:

  1. 定义克隆接口:定义一个克隆接口,通常是一个clone()方法,用于创建当前对象的一个副本。

  2. 实现克隆接口:所有可克隆的类都实现这个克隆接口,以提供复制自身的能力。

  3. 使用原型管理类(可选):可以创建一个原型管理类来管理所有的原型对象,允许增加、删除、选择原型。

  4. 复制对象:当需要创建一个新的对象时,不是通过构造函数,而是通过选择一个原型对象,并复制它来创建新对象。

  5. 深拷贝与浅拷贝:复制可以分为浅拷贝和深拷贝。浅拷贝只复制对象本身,而深拷贝会递归地复制对象的所有成员变量,包括引用类型成员。

原型模式的适用场景:

  1. 创建新对象成本较大:当对象的创建过程复杂,或者构造成本较高时,使用原型模式可以避免重复的创建过程。

  2. 需要通过实例化创建对象:在某些情况下,可能需要通过实例化一个已有的对象来创建新对象,而不是从头开始构造。

  3. 动态加载和卸载对象:在需要动态加载和卸载对象的场景中,原型模式可以方便地实现对象的复制和删除。

  4. 实现复杂对象的复制:对于包含复杂引用结构的对象,原型模式可以方便地实现对象的复制。

  5. 避免使用复杂的构造函数:当对象的构造函数过于复杂或包含多个参数时,使用原型模式可以简化对象的创建过程。

  6. 实现对象的按需复制:在某些情况下,可能需要根据当前对象的状态来创建新对象,原型模式可以方便地实现这一点。

示例代码(Java):

// 克隆接口
interface Prototype {Prototype clone();
}// 具体原型类
class Sheep implements Prototype {private String name;public Sheep(String name) {this.name = name;}@Overridepublic Prototype clone() {try {return (Sheep) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}public String getName() {return name;}
}// 客户端代码
public class PrototypePatternDemo {public static void main(String[] args) {Sheep sheep = new Sheep("喜羊羊");Sheep clonedSheep = sheep.clone();System.out.println(sheep.getName());System.out.println(clonedSheep.getName());}
}

在这个示例中,Prototype是克隆接口,Sheep是具体原型类,实现了Prototype接口的clone()方法。客户端代码演示了如何使用原型模式来复制一个Sheep对象。通过实现clone()方法,Sheep类可以创建自己的副本,而不需要使用构造函数。

原型模式是一种强大的模式,可以在多种场景下简化对象的创建过程,提高代码的灵活性和可维护性。

这篇关于赶紧收藏!2024 年最常见 20道设计模式面试题(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074020

相关文章

嵌入式软件常见的笔试题(c)

找工作的事情告一段落,现在把一些公司常见的笔试题型整理一下,本人主要是找嵌入式软件方面的工作,笔试的也主要是C语言、数据结构,大体上都比较基础,但是得早作准备,才会占得先机。   1:整型数求反 2:字符串求反,字符串加密,越界问题 3:字符串逆序,两端对调;字符串逆序,指针法 4:递归求n! 5:不用库函数,比较两个字符串的大小 6:求0-3000中含有9和2的全部数之和 7

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长,在这个色彩缤纷的季节,SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心(北京朝阳馆)隆重开幕。新老朋友共聚一堂,把酒话桑麻。 为期4天的国际学术会议以“先进复合材料,引领产业创新与可持续化发展”为主题,设立了34个主题分会场,其中包括了可持续化会场、国际大学生会场、中法复合材料制造技术峰会三个国际会场和女科技工作者委员会沙龙,

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

【SparkStreaming】面试题

Spark Streaming 是 Apache Spark 提供的一个扩展模块,用于处理实时数据流。它使得可以使用 Spark 强大的批处理能力来处理连续的实时数据流。Spark Streaming 提供了高级别的抽象,如 DStream(Discretized Stream),它代表了连续的数据流,并且可以通过应用在其上的高阶操作来进行处理,类似于对静态数据集的操作(如 map、reduce、

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,