请设计一个案例,说明当业务规则变化时,如何通过调整工厂模式中的实现来最小化对现有系统的影响。

假设我们正在构建一个电商平台系统,其核心功能之一是订单处理。订单处理需要根据不同的支付方式来计算不同的费用和执行不同的处理逻辑。为了应对业务规则的变化,我们采用工厂模式来管理不同支付方式的创建。通过这种方式,当我们需要引入新的支付方式或更改现有支付方式的逻辑时,可以最小化对现有系统的影响。

首先定义一个Payment接口,该接口包含所有支付方式需要实现的方法:

public interface Payment {
    void processPayment(double amount);
    double calculateFee(double amount);
}

接下来,为每种支付方式实现这个接口。比如,对于信用卡支付:

public class CreditCardPayment implements Payment {
    @Override
    public void processPayment(double amount) {
        // 信用卡支付逻辑
        System.out.println("Processing credit card payment for: " + amount);
    }

    @Override
    public double calculateFee(double amount) {
        // 信用卡支付费用计算
        return amount * 0.03; // 3%手续费
    }
}

银行转账支付的实现:

public class BankTransferPayment implements Payment {
    @Override
    public void processPayment(double amount) {
        // 银行转账支付逻辑
        System.out.println("Processing bank transfer payment for: " + amount);
    }

    @Override
    public double calculateFee(double amount) {
        // 银行转账支付费用计算
        if (amount > 1000) {
            return 0; // 超过1000元免费
        } else {
            return 20; // 20元固定手续费
        }
    }
}

然后创建一个工厂类PaymentFactory,用于根据支付类型创建相应的Payment对象:

public class PaymentFactory {
    public static Payment getPayment(String paymentType) {
        if (paymentType.equalsIgnoreCase("CREDITCARD")) {
            return new CreditCardPayment();
        } else if (paymentType.equalsIgnoreCase("BANKTRANSFER")) {
            return new BankTransferPayment();
        } else {
            throw new IllegalArgumentException("Unknown payment type");
        }
    }
}

当业务规则变化时,比如新增了一种新的支付方式——PayPal支付,我们只需要添加一个新的PayPalPayment类并实现Payment接口:

public class PayPalPayment implements Payment {
    @Override
    public void processPayment(double amount) {
        // PayPal支付逻辑
        System.out.println("Processing PayPal payment for: " + amount);
    }

    @Override
    public double calculateFee(double amount) {
        // PayPal支付费用计算
        return amount * 0.05; // 5%手续费
    }
}

接着,在PaymentFactory中增加一个判断条件,以支持创建PayPalPayment对象:

public class PaymentFactory {
    public static Payment getPayment(String paymentType) {
        if (paymentType.equalsIgnoreCase("CREDITCARD")) {
            return new CreditCardPayment();
        } else if (paymentType.equalsIgnoreCase("BANKTRANSFER")) {
            return new BankTransferPayment();
        } else if (paymentType.equalsIgnoreCase("PAYPAL")) {
            return new PayPalPayment();
        } else {
            throw new IllegalArgumentException("Unknown payment type");
        }
    }
}

通过这种方式,我们避免了直接修改现有代码,使得系统更加模块化,更易于维护和扩展。同时,也保证了业务规则变化不会对现有系统造成影响。