工厂模式和策略模式是两种不同的设计模式,它们各自解决了不同的问题,并且在软件架构中扮演着不同的角色。下面是这两种模式的区别以及它们各自的使用场景。
工厂模式
定义
• 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露创建逻辑,并允许系统在不修改代码的情况下选择或扩展不同的类。
• 它通过使用一个公共接口来创建对象,这些对象通常是继承自同一个抽象类或接口的不同实现。
特点
• 封装创建过程:隐藏对象的创建细节,使代码更加灵活。
• 易于扩展:当需要添加新的产品时,只需扩展工厂类即可,无需修改现有代码。
• 降低耦合:客户端代码只依赖于产品接口,而不是具体的产品实现。
使用场景
• 当需要创建的对象类型不确定时。
• 当对象的创建逻辑复杂,或者创建对象需要大量的参数时。
• 当需要将对象的创建过程独立于使用对象的客户代码时。
策略模式
定义
• 策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法独立于使用它的客户。
• 它通常用于封装一组可以互换的算法或行为。
特点
• 封装算法:将算法封装在一个接口中,并提供不同的实现。
• 易于扩展:可以通过添加新的策略类来扩展行为,而无需修改现有代码。
• 动态选择:可以在运行时动态地选择和更改策略。
使用场景
• 当一个系统需要动态地在几种算法之间切换时。
• 当算法的实现不应该与使用算法的客户紧密耦合时。
• 当需要在运行时根据不同的条件选择不同的行为时。
工厂模式和策略模式的对比
1. 用途不同:
• 工厂模式主要用于创建对象,特别是当对象的创建逻辑复杂或者需要在运行时决定使用哪种对象时。
• 策略模式主要用于封装一系列可互换的算法或行为,使得可以在运行时选择并执行不同的策略。
2. 关注点不同:
• 工厂模式关注对象的创建过程。
• 策略模式关注行为的封装和选择。
3. 解决问题不同:
• 工厂模式主要解决的是对象的创建和分发问题,它使得对象的创建过程更加灵活,可以轻松扩展新的产品类型。
• 策略模式主要解决的是策略的切换与扩展问题,它允许在运行时选择不同的算法或行为。
4. 代码实现不同:
• 工厂模式下,客户端通常只需要知道如何请求对象的创建,而具体的创建过程则由工厂类完成。
• 策略模式下,客户端可以选择不同的策略来执行不同的行为,通常需要显式地选择并传递给上下文。
结合使用
工厂模式和策略模式可以结合起来使用,例如,使用工厂模式来创建策略模式中的策略对象。这种方式可以使得策略的选择和创建过程更加灵活和简洁。
示例代码
假设我们有一个简单的场景,需要根据不同的支付方式(如信用卡、借记卡、PayPal)来处理支付。这里我们可以使用策略模式来封装不同的支付策略,并使用工厂模式来创建这些策略。
策略接口
public interface PaymentStrategy {
void pay(double amount);
}
具体策略实现
public class CreditCardStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying $" + amount + " using credit card.");
}
}
public class PayPalStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying $" + amount + " using PayPal.");
}
}
工厂类
public class PaymentStrategyFactory {
public static PaymentStrategy createPaymentStrategy(String strategyType) {
switch (strategyType) {
case "creditcard":
return new CreditCardStrategy();
case "paypal":
return new PayPalStrategy();
default:
throw new IllegalArgumentException("Invalid payment strategy: " + strategyType);
}
}
}
客户端代码
public class ShoppingCart {
private PaymentStrategy strategy;
public ShoppingCart(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void checkout(double amount) {
strategy.pay(amount);
}
public static void main(String[] args) {
// 创建策略
PaymentStrategy strategy = PaymentStrategyFactory.createPaymentStrategy("creditcard");
// 使用策略
ShoppingCart cart = new ShoppingCart(strategy);
cart.checkout(100.0);
}
}
在这个例子中,PaymentStrategyFactory 是工厂模式的实现,它根据传入的类型创建具体的策略对象。ShoppingCart 类则是策略模式的上下文,它使用一个策略对象来完成支付行为。