在总结之前的项目时,说自己用到了工厂模式。举例:业务场景中使用到了微信支付,同时还要接入支付宝支付,并且未来可能会接入更多支付方式。这种情况可以将不同的支付方式封装为一个类,然后在前端选择不同的支付方式,就创键不同的支付类,这种支付类实现同一个支付接口(这个支付接口里面应该有下单方法、回调方法)。
但其实这种场景应该更适合策略模式,将不同的支付方式看作不同的策略。

以下来探讨下工厂模式和策略模式的区别。

先总结定义:

工厂模式

属于创建型模式,主要用于对象的创建。
对象的创建过程比较复杂时使用它
代码示例:

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 负责调用具体的支付策略。

更多推荐