设计模式面试题(八)

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 天前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞1 天前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3111 天前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3111 天前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..1 天前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则
刷帅耍帅1 天前
设计模式-代理模式
设计模式·代理模式
神的孩子都在歌唱1 天前
行为设计模式 -观察者模式- JAVA
java·观察者模式·设计模式
刷帅耍帅2 天前
设计模式-解释器模式
设计模式·解释器模式
刷帅耍帅2 天前
设计模式-备忘录模式
设计模式·备忘录模式