Java 设计模式一
Java 设计模式是软件开发中的一类解决方案,旨在解决常见的设计问题,提升代码的可维护性、可复用性和扩展性。它们通常基于一些经验和最佳实践,提供了解决问题的标准化方法。以下是常见的 Java 设计模式及其概述:
1. 创建型模式 (Creational Patterns)
这些模式涉及对象的创建,关注如何实例化对象而不是直接使用构造方法。
-
单例模式 (Singleton Pattern)
确保类只有一个实例,并提供全局访问点。
例:Runtime
类是单例模式的一个例子。public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
-
工厂方法模式 (Factory Method Pattern)
定义一个创建对象的接口,允许子类决定实例化哪一个类。
例:java.util.Calendar
的子类可以根据系统的不同提供不同的实现。public interface Product { void use(); } public class ConcreteProduct implements Product { public void use() { System.out.println("Using ConcreteProduct"); } } public abstract class Creator { public abstract Product factoryMethod(); } public class ConcreteCreator extends Creator { public Product factoryMethod() { return new ConcreteProduct(); } }
-
抽象工厂模式 (Abstract Factory Pattern)
提供一个接口,用于创建一系列相关或依赖对象,而无需指定它们具体的类。
例:GUI 组件库可以通过抽象工厂来创建不同平台的按钮、文本框等控件。 -
建造者模式 (Builder Pattern)
将复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。
例:通过StringBuilder
来动态构建字符串。 -
原型模式 (Prototype Pattern)
通过复制现有的对象来创建新对象,而不是通过构造函数。
例:Object.clone()
方法是原型模式的一个实现。
2. 结构型模式 (Structural Patterns)
这些模式关注如何通过组合类和对象来获得更大的结构。
-
适配器模式 (Adapter Pattern)
将一个类的接口转换为客户希望的另一个接口,使原本接口不兼容的类可以一起工作。
例:java.io.InputStreamReader
是Reader
的适配器。public interface Target { void request(); } public class Adaptee { public void specificRequest() { System.out.println("Specific request"); } } public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } public void request() { adaptee.specificRequest(); } }
-
桥接模式 (Bridge Pattern)
将抽象部分与它的实现部分分离,使得两者可以独立变化。
例:图形绘制应用中,图形(抽象)和画笔(实现)可以分别变化。 -
装饰模式 (Decorator Pattern)
动态地给一个对象添加额外的职责,而不影响其他对象。
例:Java 的java.io.BufferedReader
类是对原始Reader
类的装饰。 -
外观模式 (Facade Pattern)
为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。
例:数据库连接池的 API 提供了一个简单的接口,隐藏了复杂的连接管理过程。 -
享元模式 (Flyweight Pattern)
使用共享对象来有效地支持大量细粒度对象的复用。
例:字符串常量池就是一个享元模式的实现。 -
代理模式 (Proxy Pattern)
为其他对象提供代理,以控制对该对象的访问。
例:Java 中的java.lang.reflect.Proxy
用于生成动态代理。
3. 行为型模式 (Behavioral Patterns)
这些模式关注对象之间的通信和职责分配。
-
观察者模式 (Observer Pattern)
定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并自动更新。
例:java.util.Observer
和Observable
是观察者模式的实现。 -
策略模式 (Strategy Pattern)
定义一系列算法,并将每个算法封装起来,使它们可以互换。
例:Java 中的Comparator
接口就是策略模式的实现。 -
命令模式 (Command Pattern)
将请求封装为一个对象,从而让用户可以通过不同的请求对客户进行参数化。
例:在图形应用程序中,每个操作(如移动、缩放)可以被封装成命令对象。 -
状态模式 (State Pattern)
允许一个对象在其内部状态改变时改变它的行为。
例:状态机就是状态模式的一个应用。 -
责任链模式 (Chain of Responsibility Pattern)
使多个对象都有机会处理请求,从而避免请求的发送者与接受者之间的耦合关系。
例:Java 中的Servlet
请求处理链就是责任链模式。 -
模板方法模式 (Template Method Pattern)
定义一个操作中的算法骨架,将一些步骤的实现延迟到子类中。
例:java.util.AbstractList
中的add()
方法使用了模板方法模式。 -
中介者模式 (Mediator Pattern)
用一个中介对象来封装一组对象之间的交互,使得对象之间不直接交互。
例:javax.swing
中的JButton
和JTextField
通过ActionListener
中介来交互。 -
迭代器模式 (Iterator Pattern)
提供一种方法来顺序访问一个集合中的元素,而不暴露集合的内部表示。
例:java.util.Iterator
是迭代器模式的实现。 -
访问者模式 (Visitor Pattern)
让你可以在不改变类的前提下,增加新的操作。
例:编译器的语法树中可以使用访问者模式来遍历各个节点并执行相应的操作。
总结
设计模式可以帮助开发者以更高效、更易维护的方式解决常见的开发问题。理解并应用这些模式能够使你的代码更具灵活性和扩展性。在实际开发中,我们通常不会盲目使用设计模式,而是根据实际需求来选择合适的模式。