设计模式面试题(八)

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)。

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

相关推荐
海特伟业14 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight14 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区17 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行17 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥18 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行19 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行19 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry19 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行19 小时前
建造者模式全方位深度解析
设计模式