不讲那么枯燥的文字。直接看个简单的示例:
场景设定
假设我们正在开发一个在线购物平台,该平台支持多种支付方式,比如微信支付、支付宝支付和银行卡支付。
1. 工厂模式
工厂模式用于创建对象,特别是当需要创建多个相关的对象时。定义支付接口
public interface PaymentStrategy {void pay(double amount);
}
具体实现类
public class WeChatPay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用微信支付支付了:" + amount + "元");}
}public class Alipay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付了:" + amount + "元");}
}public class BankCardPay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用银行卡支付了:" + amount + "元");}
}
工厂类
public class PaymentFactory {public static PaymentStrategy createPayment(String paymentMethod) {switch (paymentMethod) {case "wechat":return new WeChatPay();case "alipay":return new Alipay();case "bankcard":return new BankCardPay();default:throw new IllegalArgumentException("未知的支付方式: " + paymentMethod);}}
}
使用工厂模式
public class ShoppingCart {public void checkout(double amount, String paymentMethod) {PaymentStrategy strategy = PaymentFactory.createPayment(paymentMethod);strategy.pay(amount);}public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();cart.checkout(100.0, "wechat"); // 使用微信支付cart.checkout(200.0, "alipay"); // 使用支付宝支付cart.checkout(300.0, "bankcard"); // 使用银行卡支付}
}
2. 策略模式
策略模式用于封装算法,并允许在运行时选择不同的算法。定义支付策略接口
public interface PaymentStrategy {void pay(double amount);
}
具体实现类
public class WeChatPay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用微信支付支付了:" + amount + "元");}
}public class Alipay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付了:" + amount + "元");}
}public class BankCardPay implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用银行卡支付了:" + amount + "元");}
}
使用策略模式
public class ShoppingCart {private PaymentStrategy paymentStrategy;public ShoppingCart(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(double amount) {paymentStrategy.pay(amount);}public static void main(String[] args) {ShoppingCart cart = new ShoppingCart(new WeChatPay());cart.checkout(100.0); // 使用微信支付cart.setPaymentStrategy(new Alipay());cart.checkout(200.0); // 使用支付宝支付cart.setPaymentStrategy(new BankCardPay());cart.checkout(300.0); // 使用银行卡支付}
}
3. 区别总结
工厂模式:
- 用途:用于创建对象,特别是当需要创建多个相关的对象时。
- 关注点:对象的创建过程。
- 实现:通过工厂类(PaymentFactory)来创建不同的支付策略对象。
- 示例:通过 PaymentFactory 创建不同的支付策略对象,并在 ShoppingCart 中使用。
策略模式:
- 用途:封装算法,并允许在运行时选择不同的算法。
- 关注点:算法的选择和封装。
- 实现:通过策略接口(PaymentStrategy)和具体策略类(WeChatPay, Alipay, BankCardPay)来实现不同的支付逻辑。
- 示例:通过 ShoppingCart 类中的 setPaymentStrategy 方法来动态切换不同的支付策略。
4. 工厂模式和策略模式结合使用
在实际应用中,工厂模式和策略模式可以结合使用。例:一个创建对象,一个做支付逻辑
4.1.使用工厂模式创建支付策略对象
PaymentStrategy strategy = PaymentFactory.createPayment(paymentMethod);
4.2.使用策略模式来执行支付逻辑
ShoppingCart cart = new ShoppingCart(strategy);cart.checkout(amount);