目录
Java 设计模式详解
1. 设计模式定义
2. 设计模式示例
2.1 单例模式(Singleton Pattern)
2.2 工厂模式(Factory Pattern)
2.3 观察者模式(Observer Pattern)
2.4 代理模式(Proxy Pattern)
2.5 适配器模式(Adapter Pattern)
3. 设计模式的应用场景
4. 设计模式的注意事项
结语
Java 设计模式详解
1. 设计模式定义
设计模式(Design Patterns)是一套被软件开发行业广泛认可的最佳实践,用于解决常见的软件设计问题。它们是经验的总结,能够提高代码的可维护性、可复用性和可扩展性。
设计模式通常分为三大类:
- 创建型模式(Creational Patterns):处理对象的创建问题。
- 结构型模式(Structural Patterns):关注对象的组成结构。
- 行为型模式(Behavioral Patterns):关注对象间的交互和职责划分。
2. 设计模式示例
2.1 单例模式(Singleton Pattern)
定义:单例模式保证一个类仅有一个实例,并提供一个全局访问点。
示例(懒汉式,线程安全):
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
使用场景:
- 需要全局唯一实例,如线程池、数据库连接池、缓存管理。
注意事项:
- 需要防止反射和序列化破坏单例。
2.2 工厂模式(Factory Pattern)
定义:提供一个创建对象的接口,而不指定具体类。
示例:
interface Product {
void create();
}
class ProductA implements Product {
public void create() { System.out.println("Product A created"); }
}
class ProductB implements Product {
public void create() { System.out.println("Product B created"); }
}
class Factory {
public static Product getProduct(String type) {
if ("A".equals(type)) return new ProductA();
if ("B".equals(type)) return new ProductB();
return null;
}
}
使用场景:
- 需要创建复杂对象,但不想直接使用
new
关键字。
注意事项:
- 简单工厂模式容易违反开闭原则,建议结合工厂方法模式使用。
2.3 观察者模式(Observer Pattern)
定义:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者都会收到通知。
示例:
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update(String message);
}
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) { this.name = name; }
public void update(String message) {
System.out.println(name + " received: " + message);
}
}
class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) { observers.add(observer); }
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
Observer o1 = new ConcreteObserver("Observer 1");
Observer o2 = new ConcreteObserver("Observer 2");
subject.addObserver(o1);
subject.addObserver(o2);
subject.notifyObservers("Update received!");
}
}
使用场景:
- 事件监听机制,如 GUI 组件、消息推送。
注意事项:
- 防止循环依赖,注意性能问题。
2.4 代理模式(Proxy Pattern)
定义:代理模式为某个对象提供一个替代访问方式,控制对对象的访问。
示例:
interface Service {
void request();
}
class RealService implements Service {
public void request() {
System.out.println("Real service is processing request.");
}
}
class ProxyService implements Service {
private RealService realService;
public void request() {
if (realService == null) {
realService = new RealService();
}
System.out.println("Proxy controlling access to real service.");
realService.request();
}
}
使用场景:
- 远程代理、虚拟代理、权限控制。
注意事项:
- 可能增加额外的复杂度和性能开销。
2.5 适配器模式(Adapter Pattern)
定义:适配器模式用于将一个接口转换为客户期望的另一个接口。
示例:
interface Target {
void request();
}
class Adaptee {
void specificRequest() {
System.out.println("Adaptee-specific request");
}
}
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}
使用场景:
- 需要让旧系统兼容新接口。
注意事项:
- 可能引入额外的复杂性。
3. 设计模式的应用场景
设计模式 | 典型使用场景 |
---|---|
单例模式 | 配置管理、线程池、日志管理 |
工厂模式 | 数据库连接、日志记录、解析器 |
观察者模式 | 消息订阅、事件驱动系统 |
代理模式 | 动态代理、权限管理 |
适配器模式 | 兼容不同的 API 接口 |
策略模式 | 订单支付方式选择、排序算法 |
装饰器模式 | 运行时动态增加功能,如 I/O 流 |
4. 设计模式的注意事项
- 选择合适的模式:不要盲目使用设计模式,确保它真正解决问题。
- 避免过度设计:不必要的设计模式会增加代码复杂性。
- 结合 SOLID 原则:确保代码的可维护性和可扩展性。
- 关注性能:某些模式(如观察者模式)可能带来额外的性能开销。
- 遵循开闭原则:尽量让代码对扩展开放,对修改封闭。
结语
Java 设计模式是提升代码质量的有力工具。掌握这些模式,可以在开发中编写出更加优雅、可维护的代码。建议通过实践不断加深理解,灵活运用设计模式解决实际问题!