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

2024-06-17 22:12

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

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

三、解释抽象工厂模式,并给出一个实际应用的例子。

抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象的接口,而无需指定它们具体的类。这种模式通常用于当需要生成一组对象时,这些对象具有共同的抽象特性,但是具体实现可能因情况而异。

抽象工厂模式的特点:

  1. 抽象化:定义了一个创建对象的接口,允许通过子类来生成具体对象。
  2. 封装性:客户端不需要知道具体的类是如何实现的,只需要知道它们遵循相同的接口。
  3. 灵活性:可以独立于具体类的变化而变化,易于扩展新的产品族。
  4. 解耦:将类的实例化延迟到子类中进行。

抽象工厂模式的结构:

  1. 抽象工厂(Abstract Factory):声明了一组创建对象的方法,每个方法对应一种产品。
  2. 具体工厂(Concrete Factory):实现抽象工厂的接口,生成一组具体产品。
  3. 抽象产品(Abstract Product):定义了产品的接口。
  4. 具体产品(Concrete Product):实现了抽象产品的接口,由具体工厂创建。

抽象工厂模式的实现步骤:

  1. 定义抽象产品类和接口。
  2. 定义具体产品类,实现抽象产品接口。
  3. 定义抽象工厂类,提供创建抽象产品的接口。
  4. 定义具体工厂类,实现抽象工厂的接口,生成具体产品。

抽象工厂模式的示例(Java语言):

// 抽象产品A
interface ProductA {void doSomething();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {public void doSomething() {System.out.println("具体产品A1的doSomething方法");}
}// 抽象产品B
interface ProductB {void doSomething();
}// 具体产品B1
class ConcreteProductB1 implements ProductB {public void doSomething() {System.out.println("具体产品B1的doSomething方法");}
}// 抽象工厂
interface Factory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1
class ConcreteFactory1 implements Factory {public ProductA createProductA() {return new ConcreteProductA1();}public ProductB createProductB() {return new ConcreteProductB1();}
}

使用场景:

抽象工厂模式的一个实际应用例子是GUI工具包。假设你正在开发一个应用程序,需要支持多种不同的GUI工具包,例如Windows风格和Mac风格。每种风格都有自己的按钮、文本框等控件。

// GUI组件的抽象产品
interface Button {void paint();
}interface TextBox {void paint();
}// Windows风格的具体产品
class WindowsButton implements Button {public void paint() {System.out.println("绘制Windows风格的按钮");}
}class WindowsTextBox implements TextBox {public void paint() {System.out.println("绘制Windows风格的文本框");}
}// Mac风格的具体产品
class MacButton implements Button {public void paint() {System.out.println("绘制Mac风格的按钮");}
}class MacTextBox implements TextBox {public void paint() {System.out.println("绘制Mac风格的文本框");}
}// 抽象工厂
interface GUIFactory {Button createButton();TextBox createTextBox();
}// Windows风格的具体工厂
class WindowsFactory implements GUIFactory {public Button createButton() {return new WindowsButton();}public TextBox createTextBox() {return new WindowsTextBox();}
}// Mac风格的具体工厂
class MacFactory implements GUIFactory {public Button createButton() {return new MacButton();}public TextBox createTextBox() {return new MacTextBox();}
}

在这个例子中,GUIFactory是一个抽象工厂,用于创建GUI组件。WindowsFactoryMacFactory是具体工厂,分别生成Windows和Mac风格的GUI组件。应用程序可以根据用户的选择或系统环境来使用不同的工厂,从而生成相应风格的GUI组件。这样,应用程序的GUI就可以很容易地适应不同的操作系统风格,而不需要修改大量的代码。

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

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

建造者模式的特点:

  1. 分离构建与表示:将对象的构建过程从其表示中分离出来,使得相同的构建过程可以创建不同的表示。
  2. 灵活性:可以控制复杂对象的构建过程,允许逐步构建对象,并且可以在构建过程中修改构建步骤。
  3. 可扩展性:当需要添加新的产品属性或构造方法时,不需要修改现有的构建类,只需要添加新的建造者类即可。
  4. 减少复杂性:避免了使用大量的可选参数,这些参数可能会使构造函数变得复杂且难以管理。

建造者模式的结构:

  1. 产品(Product):需要构建的复杂对象。
  2. 建造者(Builder):创建产品的接口,定义了一系列的设置方法,用于设置产品的不同部分。
  3. 具体建造者(Concrete Builder):实现建造者接口,具体实现构建产品的方法。
  4. 指挥者(Director):负责使用建造者来构建产品的过程,它不依赖于具体建造者的具体实现。

建造者模式的实现步骤:

  1. 定义产品类,包含多个属性和构造这些属性的方法。
  2. 定义建造者接口,包含设置产品属性的方法和一个返回产品实例的方法。
  3. 实现具体建造者类,实现建造者接口,并构建最终的产品实例。
  4. 定义指挥者类,包含一个方法,接受一个建造者对象,并使用它来构建产品。

建造者模式的示例(Java语言):

// 产品类
class Product {private String part1;private String part2;public void setPart1(String part1) {this.part1 = part1;}public void setPart2(String part2) {this.part2 = part2;}@Overridepublic String toString() {return "Product{" +"part1='" + part1 + '\'' +", part2='" + part2 + '\'' +'}';}
}// 建造者接口
interface Builder {void setPart1(String part1);void setPart2(String part2);Product build();
}// 具体建造者
class ConcreteBuilder implements Builder {private Product product = new Product();public void setPart1(String part1) {product.setPart1(part1);}public void setPart2(String part2) {product.setPart2(part2);}public Product build() {return product;}
}// 指挥者
class Director {public Product construct(Builder builder) {builder.setPart1("Part1");builder.setPart2("Part2");return builder.build();}
}

使用场景:

建造者模式非常适合于以下场景:

  • 当创建复杂对象的算法应该独立于对象本身的表示时。
  • 当需要创建一个复杂对象的不同变体时。
  • 当希望对象的创建过程与使用过程分离时。

例如,假设你正在构建一个汽车配置系统,汽车可能有不同的引擎、轮胎、颜色等配置选项。使用建造者模式,你可以定义一个汽车建造者接口,然后为每种配置实现一个具体的建造者类。指挥者类可以根据不同的需求调用不同的建造者来构建具有特定配置的汽车实例。

通过这种方式,建造者模式提供了一种灵活且可扩展的方式来构建复杂的对象,同时保持了代码的清晰和易于管理。

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



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

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO