第八章:设计模式
8.3 设计模式的应用场景
设计模式是解决特定问题的经验总结,它们为常见的软件设计问题提供了可复用的解决方案。在实际开发中,合理应用设计模式可以提高代码的可维护性、可扩展性和复用性。以下是几种常用设计模式及其典型应用场景:
1. 单例模式(Singleton)
应用场景:
- 需要全局唯一实例的场景,如数据库连接池、线程池、日志管理器等。
- 配置文件的读取和缓存管理。
- 工具类对象的创建(避免重复实例化)。
示例:
public class DatabaseConnection {
private static DatabaseConnection instance;
private DatabaseConnection() {}
public static synchronized DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
}
2. 工厂模式(Factory)
应用场景:
- 对象的创建逻辑复杂,需要统一管理。
- 需要动态扩展产品类型(如不同数据库驱动的切换)。
- 隐藏具体实现类,仅暴露接口(如Spring的BeanFactory)。
示例:
public interface Payment {
void pay();
}
public class CreditCardPayment implements Payment {
@Override
public void pay() {
System.out.println("Credit card payment");
}
}
public class PaymentFactory {
public static Payment createPayment(String type) {
if ("credit".equals(type)) {
return new CreditCardPayment();
}
throw new IllegalArgumentException("Invalid payment type");
}
}
3. 观察者模式(Observer)
应用场景:
- 事件驱动的系统,如GUI按钮点击事件、消息队列监听。
- 实现发布-订阅模型(如Spring的事件机制)。
- 数据变更通知(如电商系统中的库存变化通知)。
示例:
public interface Observer {
void update(String message);
}
public class User implements Observer {
@Override
public void update(String message) {
System.out.println("User received: " + message);
}
}
public class NewsAgency {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void notifyObservers(String news) {
for (Observer observer : observers) {
observer.update(news);
}
}
}
4. 策略模式(Strategy)
应用场景:
- 需要动态切换算法或行为(如排序算法、支付方式选择)。
- 避免多重条件判断(如电商平台的折扣策略)。
- 扩展新的算法无需修改原有代码。
示例:
public interface DiscountStrategy {
double applyDiscount(double price);
}
public class VIPDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.8;
}
}
public class ShoppingCart {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double checkout(double price) {
return strategy.applyDiscount(price);
}
}
5. 装饰器模式(Decorator)
应用场景:
- 动态扩展对象功能(如Java I/O流中的
BufferedReader)。 - 避免通过继承导致类爆炸(如咖啡加糖、加奶的组合)。
示例:
public interface Coffee {
double getCost();
String getDescription();
}
public class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 2.0;
}
@Override
public String getDescription() {
return "Simple coffee";
}
}
public class MilkDecorator implements Coffee {
private Coffee coffee;
public MilkDecorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public double getCost() {
return coffee.getCost() + 0.5;
}
@Override
public String getDescription() {
return coffee.getDescription() + ", with milk";
}
}
总结
设计模式的选择应基于实际需求,避免过度设计。核心原则是:
- 识别问题:明确需要解决的痛点(如对象创建、行为扩展等)。
- 匹配模式:选择最符合场景的模式(如单例解决全局唯一性,策略解决算法切换)。
- 保持灵活:优先使用组合而非继承,遵循开闭原则(对扩展开放,对修改关闭)。
