理解工厂模式和策略模式的区别
·
在总结之前的项目时,说自己用到了工厂模式。举例:业务场景中使用到了微信支付,同时还要接入支付宝支付,并且未来可能会接入更多支付方式。这种情况可以将不同的支付方式封装为一个类,然后在前端选择不同的支付方式,就创键不同的支付类,这种支付类实现同一个支付接口(这个支付接口里面应该有下单方法、回调方法)。
但其实这种场景应该更适合策略模式,将不同的支付方式看作不同的策略。
以下来探讨下工厂模式和策略模式的区别。
先总结定义:
工厂模式
属于创建型模式,主要用于对象的创建。
对象的创建过程比较复杂时使用它
代码示例:
interface Product {
void use();
}
class ProductA implements Product {
public void use() {
System.out.println("Using Product A");
}
}
class ProductB implements Product {
public void use() {
System.out.println("Using Product B");
}
}
class Factory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ProductA();
} else if (type.equals("B")) {
return new ProductB();
}
return null;
}
}
// 客户端代码
Product product = Factory.createProduct("A");
product.use();
策略模式
属于行为型模式,主要用于算法的封装和动态切换
代码示例:
// 策略接口
interface Strategy {
void execute();
}
// 具体策略
class StrategyA implements Strategy {
public void execute() {
System.out.println("Executing Strategy A");
}
}
// 上下文类
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute(); // 上下文负责调用策略
}
}
// 客户端代码
Context context = new Context(new StrategyA()); // 客户端选择策略
context.executeStrategy(); // 上下文执行策略
通俗理解:工厂模式就是关注最终创键的对象,由一个工厂类产出不同的对象;
策略模式会有一个上下文,上下文依赖不同的策略,然后上下文根据以来的策略来执行对应的行为。
实战示例
文首提到的,多个支付方式的场景,我们可以用工厂模式创键不同的策略对象,然后用策略模式执行对应的支付方式。
代码示例:
// 支付策略接口
interface PaymentStrategy {
void pay(BigDecimal amount);
}
// 微信支付策略
class WechatPaymentStrategy implements PaymentStrategy {
public void pay(BigDecimal amount) {
System.out.println("微信支付,金额:" + amount);
}
}
// 支付宝支付策略
class AlipayPaymentStrategy implements PaymentStrategy {
public void pay(BigDecimal amount) {
System.out.println("支付宝支付,金额:" + amount);
}
}
// 支付策略工厂
class PaymentStrategyFactory {
public static PaymentStrategy getPaymentStrategy(String paymentType) {
switch (paymentType) {
case "wechat":
return new WechatPaymentStrategy();
case "alipay":
return new AlipayPaymentStrategy();
default:
throw new IllegalArgumentException("不支持的支付方式:" + paymentType);
}
}
}
// 支付服务(上下文)
class PaymentService {
private PaymentStrategy paymentStrategy;
public PaymentService(String paymentType) {
this.paymentStrategy = PaymentStrategyFactory.getPaymentStrategy(paymentType); // 工厂创建策略
}
public void pay(BigDecimal amount) {
paymentStrategy.pay(amount); // 策略执行支付
}
}
// 客户端代码
PaymentService wechatPayment = new PaymentService("wechat");
wechatPayment.pay(new BigDecimal("100.00")); // 微信支付
PaymentService alipayPayment = new PaymentService("alipay");
alipayPayment.pay(new BigDecimal("200.00")); // 支付宝支付
上述例子中:
工厂模式:PaymentStrategyFactory 负责创建具体的支付策略对象。
策略模式:PaymentService 负责调用具体的支付策略。
更多推荐



所有评论(0)