1. 请列举出在 JDK 中几个常用的设计模式?
在JDK中,设计模式被广泛地使用以提高代码的可重用性、可维护性和扩展性。以下是几个在JDK中常用的设计模式:
-
单例模式(Singleton) : 确保一个类只有一个实例,并提供该实例的全局访问点。例如,
java.lang.Runtime
类就是一个单例,它提供了访问运行时环境的方法。 -
工厂方法模式(Factory Method) : 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类。例如,
java.util.Calendar
、ResourceBundle
和NumberFormat
类使用工厂方法来实例化。 -
抽象工厂模式(Abstract Factory) : 提供一个接口,用于创建相关的对象家族,而不需要明确指定具体类。例如,
javax.xml.parsers.DocumentBuilderFactory
和javax.xml.transform.TransformerFactory
。 -
建造者模式(Builder) : 通过将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
java.lang.StringBuilder
和java.lang.StringBuffer
是建造者模式的例子,它们提供了构造和操作字符串对象的方法。 -
原型模式(Prototype) : 用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
java.lang.Cloneable
接口的使用就是原型模式的例子。 -
适配器模式(Adapter) : 将一个类的接口转换成客户希望的另外一个接口。
java.util.Enumeration
和java.util.Iterator
之间的适配器就是一个例子。 -
装饰器模式(Decorator) : 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
java.io.BufferedInputStream
和java.io.DataInputStream
是装饰器模式的例子,它们增加了对 InputStream 的功能扩展。 -
观察者模式(Observer) : 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生改变时,会通知所有观察者对象。
java.util.Observer
和java.util.Observable
是观察者模式的经典实现(虽然在Java 9中已被标记为过时)。 -
策略模式(Strategy) : 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
java.util.Comparator
就是策略模式的一个例子,它允许定义多种排序策略。 -
代理模式(Proxy) : 为其他对象提供一个代理以控制对这个对象的访问。
java.lang.reflect.Proxy
和java.rmi.*
包中的远程代理实现都是代理模式的例子。
这些设计模式在JDK中的应用不仅展示了面向对象设计的强大和灵活性,也提供了一种解决常见问题的有效方法。
2.什么是设计模式?你是否在你的代码里面使用过任 何设计模式?
设计模式是一种在软件开发过程中常见问题的通用、可重用的解决方案。它不是一段可以直接被转换成代码的模板,而是在特定情境下对问题的一种描述和解决方案。设计模式可以加快开发过程,因为它提供了已经被证实的解决方案,避免了常见问题的重复解决努力。使用设计模式有助于使代码更易于理解、维护,并促进代码的重用。
设计模式通常被分为三大类:
-
创建型模式:关注对象创建的机制,试图在创建对象的同时隐藏创建逻辑,而不是使用新的运算符直接实例化对象。这样可以提高系统的灵活性。例如,单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)、原型(Prototype)。
-
结构型模式:关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。例如,适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、组合(Composite)、外观(Facade)、享元(Flyweight)、代理(Proxy)。
-
行为型模式:关注对象间的职责分配。它们描述了对象之间如何协作和分配职责。例如,责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy)、模板方法(Template Method)、访问者(Visitor)。
至于我自己,在处理类似的情景时,确实会"使用"到这些模式,或者说,我的设计思考是受到这些经典模式的启发。当解释关于代码结构、算法实现或数据处理的问题时,我会自然而然地采用这些模式中的逻辑。例如,解释如何组织对象以实现某种功能时,我可能会采用工厂方法或者抽象工厂模式的思想。讨论如何处理对象间的动态交互时,我可能会采用观察者模式的概念。所以,虽然我不编写代码,但我的解决方案建议和思维过程是深受这些设计模式影响的。