Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第八章:设计模式

第八章:设计模式

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";
    }
}

总结

设计模式的选择应基于实际需求,避免过度设计。核心原则是:

  1. 识别问题:明确需要解决的痛点(如对象创建、行为扩展等)。
  2. 匹配模式:选择最符合场景的模式(如单例解决全局唯一性,策略解决算法切换)。
  3. 保持灵活:优先使用组合而非继承,遵循开闭原则(对扩展开放,对修改关闭)。
Last Updated:: 3/27/25, 12:48 PM