工厂模式

工厂模式(Factory Pattern) #

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。

通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。

应用场景1:创建支付订单 #

需求描述:在商城中,用户下单并支付,提供微信支付、支付宝、银联给用户选择。后台根据用户选择的支付厂商生成支付订单并返回。

用一坨代码实现 #

public class PayService {
	@Value("${pay.wx.merchantId}")
    private static String wxMerchantId;
    
    @Value("${pay.ali.merchantId}")
    private static String aliMerchantId;
    
    @Value("${pay.payPal.merchantId}")
    private static String payPalMerchantId;
    
	public String genPayOrder(String outTradeNo, int total, int payType) {
		if(payType == 1) {
			// 微信支付
			System.out.println("选择了微信支付,收款商户号是:" + wxMerchantId);
			// 创建微信支付请求
			PrepayRequest request = new PrepayRequest();
			// 设置请求参数
			Amount amount = new Amount();
            amount.setTotal(total);
            request.setAmount(amount);
            request.setMchid(wxMerchantId);
            request.setOutTradeNo(outTradeNo);
            // 略
            return xxxxx;
		} else if (payType == 2) {
			// 支付宝
			System.out.println("选择了支付宝支付,收款商户号是:" + aliMerchantId);
			// 略
			return xxxxx;
		} else if (payType == 3) {
			// 银联
			System.out.println("选择了银联支付,收款商户号是:" + payPalMerchantId);
			// 略
			return xxxxx;
		}
	}
}

若使用上述实现方式,假如有一天微信支付接口更新,需要修改,则需要在这一大坨代码中找到微信支付相关的代码去修改,稍不注意可能影响到其它代码,可维护性非常差。

工厂模式实现 #

定义生成订单接口 #

public interface IGenOrder {
	String genOrder(String outTradeOrder, int total);
}

实现生成订单接口 - 微信支付 #

public class WxPayService implements IGenOrder {
	@Value("${pay.wx.merchantId}")
    private static String wxMerchantId;
	
	@Override
	String genOrder(String outTradeOrder, int total) {
		System.out.println("选择了微信支付,收款商户号是:" + wxMerchantId);
		// 创建微信支付请求
		PrepayRequest request = new PrepayRequest();
		// 设置请求参数
		Amount amount = new Amount();
        amount.setTotal(total);
        request.setAmount(amount);
        request.setMchid(wxMerchantId);
        request.setOutTradeNo(outTradeNo);
        // 略
        return xxxxx;
	}
}

实现生成订单接口 - 支付宝 #

public class AliPayService implements IGenOrder {
	@Value("${pay.ali.merchantId}")
    private static String aliMerchantId;
	
	@Override
	String genOrder(String outTradeOrder, int total) {
		System.out.println("选择了支付宝支付,收款商户号是:" + aliMerchantId);
		// 略
		return xxxxx;
	}
}

实现生成订单接口 - 银联 #

public class PayPalService implements IGenOrder {
	@Value("${pay.payPal.merchantId}")
    private static String payPalMerchantId;
	
	@Override
	String genOrder(String outTradeOrder, int total) {
		System.out.println("选择了银联支付,收款商户号是:" + payPalMerchantId);
		// 略
		return xxxxx;
	}
}

创建支付厂商工厂 #

public class PayOrderServiceFactory {
	public IGenOrder getPayOrderService(int payType) {
		if (payType == 1) {
			return new WxPayService();
		} else if (payType == 2) {
			return new AliPayService();
		} else if (payType == 3) {
			return new PayPalService();
		}
	}
}

入口方法 #

public class PayService {
	public String genPayOrder(String outTradeNo, int total, int payType) {
		PayOrderServiceFactory factory = new PayOrderServiceFactory();
		IGenOrder orderService = factory.getPayOrderService(payType);
		return orderService.genOrder(outTradeNo, total);
	}
}

小结 #

使用工厂模式实现上述需求,体现了单一职责原则,后续任意一个支付厂商的接口发生变动,只需要找到对应的类修改即可,非常易于维护和扩展。