工厂模式(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);
}
}
小结 #
使用工厂模式实现上述需求,体现了单一职责原则,后续任意一个支付厂商的接口发生变动,只需要找到对应的类修改即可,非常易于维护和扩展。