赶紧收藏!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类可以创建自己的副本,而不需要使用构造函数。

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

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

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

相关文章

看完轻松解决家里灰尘毛絮多难题?除粉尘的空气净化器品牌分享

家里的空气中弥漫着灰尘和毛絮,让人呼吸不畅,也影响着家人的健康。灰尘中含有各种有害物质,如细菌、病毒、花粉等,长期吸入会导致呼吸道疾病、皮肤过敏等问题。尤其是对于有宠物、孩子、过敏人群来说,空气质量更是至关…

关于办公软件的使用

第一部分: 常用函数的使用 在使用的地方,输入SUM(B2:F2)回车 第二部分: 自定义函数的使用 1、打开 宏编辑 2、 自定义函数方法 3、自定义函数的使用和常用函数一样: 在使用的地方,输入计算面积(A3,B3)…

游戏试玩站打码zq平台系统可运营的任务网源码

安装说明 1.恢复数据; 2.数据连接库配置路径:protected\config\mail.php 文件中修改第60行 (记得不要用记事本修改,否则可能会出现验证码显示不了问题,建议用Notepad) 3.浏览器访问输入 127.0.0.2 显示界…

Hype4.0 for Mac软件下载-Hype for Mac HTML5 创作工具下载附加详细安装步骤

Hype 4 Pro Mac正式版是款功能实用的动画创作工具。Hype 4 Pro Mac最新版可以帮您轻松创建令人惊叹的动画和交互式网页内容。并且Hype 4 Pro Mac还可被设计师用来创建动画,为网页、信息图形、演示文稿、数字杂志、广告、iBooks、教育内容、应用程序原型、作品集、动…

C# —— 字典

简介 字典: 包含一个key(键)和这个key所对应的value(值),字典是无序的,key是唯一的&#xff0c;可以根据key获取值。可以吧键当成数组的索引值进行理解 <> 泛型 定义一个字典 new Dictionary<key的类型, value值的类型>() var dic new Dictionary<string, s…

Flume基础教程

Apache Flume教程 资料来源&#xff1a;Apache Flume - Introduction (tutorialspoint.com) Flume是一个标准的、简单的、健壮的、灵活的、可扩展的工具&#xff0c;用于将从各种数据生产者(web服务器)中所产生的数据抽取到Hadoop中。在本教程中&#xff0c;我们将使用简单的…

软件测试技术(一):软件测试流程

软件测试流程 软件测试流程如下&#xff1a; 测试计划测试设计测试执行 单元测试集成测试确认测试系统测试验收测试回归测试验证活动 测试计划 测试计划由测试负责人来编写&#xff0c;用于确定各个测试阶段的目标和策略。这个过程将输出测试计划&#xff0c;明确要完成的测…

ch552g使用torch-pad测试触摸按键遇到的问题

基本工作原理 通过设置好功能在寄存器和控制寄存器检测引脚输入的值。 实际检测阶段分为3个步骤&#xff1a;第一阶段&#xff1a;选择需要检测的阶段&#xff0c;选择扫描周期1或2ms&#xff0c;开启触摸按键中断&#xff0c;然后在87us内为充电准备阶段&#xff0c;87us内数…

Matplotlib(小案例)

1、3D表面形状的绘制 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np import matplotlib as mplfigplt.figure() axfig.add_subplot(111,projection3d)unp.linspace(0,2*np.pi,100) vnp.linspace(0,np.pi,100) x10*np.outer(n…

Faiss assertion ‘err == cudaSuccess‘ failed in void faiss::gpu:runL2Norm()

Faiss assertion ‘err cudaSuccess’ failed in void faiss::gpu:runL2Norm(). details:CUA error 209 no kernel image is available for execution on the device 本人使用的ubuntu 22.04系统&#xff0c;conda的环境。使用pip安装faiss-gpu出现的问题。 pip install fai…

心跳机制讲解及实例

什么是心跳机制 心跳机制出现在tcp长连接中&#xff0c;客户端和服务器之见定时发送一种特殊的数据包通知对方还在线&#xff0c;以确保tcp链接地可靠性&#xff0c;有可能tcp链接由于某些原因(列入网线被拔了&#xff0c;突然断电)导致客户端断了&#xff0c;但是服务器不知道…

从11个视角看全球Rust程序员3/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 6 Rust程序员都在用什么IDE? 基于之前的讨论,小吾想今年底的IntelliJ全球程序员生态报告出来后,IDE使用的情况可能会发生一些变化。小吾预计会有更多的程序员从IntelliJ IDEA和CLion转向RustRover。 55%的程序员在使用Visual Studio Code24%的程…

编程猫少儿编程怎么下载:详细步骤与实用指南

编程猫少儿编程怎么下载&#xff1a;详细步骤与实用指南 在数字化教育浪潮的推动下&#xff0c;编程猫少儿编程作为一款专为青少年设计的图形化编程工具平台&#xff0c;受到了越来越多家长和孩子的青睐。那么&#xff0c;如何下载并安装这款应用呢&#xff1f;接下来&#xf…

PostgreSQL源码分析——bgwriter

为什么会有bgwriter bgwriter进程主要负责将共享缓冲区&#xff08;Buffer&#xff09;中的脏页刷盘&#xff0c;这个进程主要是从数据库性能的考虑而加的&#xff0c;如果没有这个进程&#xff0c;数据库一样可以工作。所以&#xff0c;这里重点理解的就是bgwriter进程对性能…

SQL注入-中篇

SQL盲注 一、时间盲注 模拟环境&#xff1a;Less-9 概述 延迟注入&#xff0c;一种盲注的手法&#xff0c;提交对执行时间敏感的sql语句&#xff0c;通过执行时间的长短来判断是否执行成功。 时间注入函数 sleep() if() ascii() substring() length() mid()判断是否存在延…

存储文件夹下所有.cpp和.h的代码到对应的txt文件里

最近大半年刷了160多天的题&#xff0c;每次刷的时候都要新建一个VS文件&#xff0c;所以文件内存太大了&#xff0c;又舍不得删&#xff0c;就用ai整了一个脚本&#xff0c;可将当前路径下的所有文件里的.cpp和.h文件储存到相应名字的txt文件里&#xff0c;若文件夹下还有文件…

SpringBoot + Maven 项目的创建

文章目录 1、Maven2、SpringBoot3、二者之间的联系4、项目的创建 在创建项目之前&#xff0c;肯定要知道他们之间的区别 1、Maven maven是一个跨平台的项目管理工具。它是Apache的一个开源项目&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 比如说…

Spring注解----------@Deprecated

情景&#xff1a; 在我们开发过程中&#xff0c;有时候会遇到我们需要将几个类中的方法集中到一个类中&#xff0c;但是我们又不希望把我们的原来的类删掉&#xff08;就是单纯的不想删除&#xff0c;都是我写的代码我不想杀死我的结晶&#xff0c;不能说我写的是shi&#xff…

为什么要选择华为 HCIE-Security 课程?

2020 年我国网络安全市场规模达到 680 亿元&#xff0c;同比增长 25%。随着对网络安全的愈加重视及布局&#xff0c;市场规模将持续扩大。 近年来&#xff0c;随着“云大物工移智”等新兴技术的快速发展和普及应用&#xff0c;数字化已经融入社会经济生活的方方面面&#xff0c…

自我激励学习提升语言模型的推理能力

随着人工智能技术的快速发展&#xff0c;语言模型&#xff08;LMs&#xff09;在各种下游任务中展现出了卓越的能力。特别是在少样本&#xff08;few-shot&#xff09;和零样本&#xff08;zero-shot&#xff09;学习环境中&#xff0c;通过吸收特定任务的指令和示例&#xff0…