设计模式面试题(八)

1. 请列举出在 JDK 中几个常用的设计模式?

在JDK中,设计模式被广泛地使用以提高代码的可重用性、可维护性和扩展性。以下是几个在JDK中常用的设计模式:

  1. 单例模式(Singleton): 确保一个类只有一个实例,并提供该实例的全局访问点。例如,java.lang.Runtime 类就是一个单例,它提供了访问运行时环境的方法。

  2. 工厂方法模式(Factory Method): 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类。例如,java.util.CalendarResourceBundleNumberFormat 类使用工厂方法来实例化。

  3. 抽象工厂模式(Abstract Factory): 提供一个接口,用于创建相关的对象家族,而不需要明确指定具体类。例如,javax.xml.parsers.DocumentBuilderFactoryjavax.xml.transform.TransformerFactory

  4. 建造者模式(Builder): 通过将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。java.lang.StringBuilderjava.lang.StringBuffer 是建造者模式的例子,它们提供了构造和操作字符串对象的方法。

  5. 原型模式(Prototype): 用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。java.lang.Cloneable 接口的使用就是原型模式的例子。

  6. 适配器模式(Adapter): 将一个类的接口转换成客户希望的另外一个接口。java.util.Enumerationjava.util.Iterator 之间的适配器就是一个例子。

  7. 装饰器模式(Decorator): 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。java.io.BufferedInputStreamjava.io.DataInputStream 是装饰器模式的例子,它们增加了对 InputStream 的功能扩展。

  8. 观察者模式(Observer): 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生改变时,会通知所有观察者对象。java.util.Observerjava.util.Observable 是观察者模式的经典实现(虽然在Java 9中已被标记为过时)。

  9. 策略模式(Strategy): 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。java.util.Comparator 就是策略模式的一个例子,它允许定义多种排序策略。

  10. 代理模式(Proxy): 为其他对象提供一个代理以控制对这个对象的访问。java.lang.reflect.Proxyjava.rmi.* 包中的远程代理实现都是代理模式的例子。

这些设计模式在JDK中的应用不仅展示了面向对象设计的强大和灵活性,也提供了一种解决常见问题的有效方法。

2.什么是设计模式?你是否在你的代码里面使用过任 何设计模式?

设计模式是一种在软件开发过程中常见问题的通用、可重用的解决方案。它不是一段可以直接被转换成代码的模板,而是在特定情境下对问题的一种描述和解决方案。设计模式可以加快开发过程,因为它提供了已经被证实的解决方案,避免了常见问题的重复解决努力。使用设计模式有助于使代码更易于理解、维护,并促进代码的重用。

设计模式通常被分为三大类:

  1. 创建型模式:关注对象创建的机制,试图在创建对象的同时隐藏创建逻辑,而不是使用新的运算符直接实例化对象。这样可以提高系统的灵活性。例如,单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)、原型(Prototype)。

  2. 结构型模式:关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。例如,适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、组合(Composite)、外观(Facade)、享元(Flyweight)、代理(Proxy)。

  3. 行为型模式:关注对象间的职责分配。它们描述了对象之间如何协作和分配职责。例如,责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy)、模板方法(Template Method)、访问者(Visitor)。

至于我自己,在处理类似的情景时,确实会“使用”到这些模式,或者说,我的设计思考是受到这些经典模式的启发。当解释关于代码结构、算法实现或数据处理的问题时,我会自然而然地采用这些模式中的逻辑。例如,解释如何组织对象以实现某种功能时,我可能会采用工厂方法或者抽象工厂模式的思想。讨论如何处理对象间的动态交互时,我可能会采用观察者模式的概念。所以,虽然我不编写代码,但我的解决方案建议和思维过程是深受这些设计模式影响的。

相关推荐

  1. 设计模式面试

    2024-04-08 15:00:02       14 阅读
  2. 设计模式-面试

    2024-04-08 15:00:02       36 阅读
  3. 设计模式-单例模式模拟面试股)

    2024-04-08 15:00:02       23 阅读
  4. 设计模式面试(一)

    2024-04-08 15:00:02       16 阅读
  5. 设计模式面试(二)

    2024-04-08 15:00:02       15 阅读
  6. 设计模式面试(七)

    2024-04-08 15:00:02       17 阅读
  7. 设计模式面试(六)

    2024-04-08 15:00:02       15 阅读
  8. 设计模式面试(九)

    2024-04-08 15:00:02       16 阅读
  9. MyBatis 面试

    2024-04-08 15:00:02       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 15:00:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 15:00:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 15:00:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 15:00:02       20 阅读

热门阅读

  1. Mysql服务器主从相关

    2024-04-08 15:00:02       13 阅读
  2. 嵌入式算法开发系列之归一化算法

    2024-04-08 15:00:02       15 阅读
  3. 面试前端八股文十问十答第八期

    2024-04-08 15:00:02       13 阅读
  4. mysql锁

    mysql锁

    2024-04-08 15:00:02      10 阅读
  5. docker 之 基本命令

    2024-04-08 15:00:02       13 阅读
  6. docker build 构建不出新镜像一直都是老镜像

    2024-04-08 15:00:02       13 阅读
  7. 第十四届蓝桥杯c++组B组做题笔记

    2024-04-08 15:00:02       13 阅读
  8. AJAX

    AJAX

    2024-04-08 15:00:02      17 阅读
  9. 机器学习(Machine Learning)知识点

    2024-04-08 15:00:02       15 阅读