本文最后更新于7 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
I.静态工厂方法:
核心目的就是解耦:把复杂的逻辑表示封装在一个单独的静态工厂类,类似工具类一样的角色;
为什么是静态?是因为设计成静态的话就可以直接通过类名来调用方法了,省去了麻烦的new语句;
当主类需要实现复杂的业务逻辑时,
单独将逻辑封装进一个对应的静态工厂方法中(封装变化点)
主类只需要静态的调用工厂方法(简洁接口)
并传入正确的参数(控制逻辑)
此时工厂类会通过参数调用对应的静态方法并返回给主类
这样就完成了静态工厂方法的应用,此时需要修改业务逻辑只需要修改工厂类中的逻辑,达到了解耦的目的
同时还保持了主类中的逻辑简洁,代码干净.
代码示例:
public class OrderService {
public void payOrder(String orderId, String payType) {
// 复杂的创建逻辑分散在业务代码中
Payment payment;
if ("alipay".equals(payType)) {
payment = new AlipayPayment(key, secret, config); // 需要知道复杂的参数
} else if ("wechatpay".equals(payType)) {
payment = new WechatPayment(appId, mchId, key);
} else if ("bankcard".equals(payType)) {
payment = new BankCardPayment(apiUrl, merchantNo);
} else {
throw new RuntimeException("Unsupported pay type");
}
payment.pay(...); // 支付逻辑
// ... 更多订单逻辑 ...
}
}
如上,代码十分冗杂且不具备可维护性,所以这里就需要静态工厂方法来拯救(因为静态工厂方法最简洁,但是灵活性不如其他的工厂方法)
而通过静态工厂方法方式的代码:
public class PaymentFactory {
// 封装所有复杂的创建逻辑
public static Payment createPayment(String payType) {
// 依据传入的参数调用对应的写好的方法
if ("alipay".equals(payType)) {
return new AlipayPayment(getAlipayKey(), getAlipaySecret(), getAlipayConfig());
} else if ("wechatpay".equals(payType)) {
return new WechatPayment(getWechatAppId(), getWechatMchId(), getWechatKey());
} else if ("bankcard".equals(payType)) {
return new BankCardPayment(getBankApiUrl(), getMerchantNo());
} else {
throw new RuntimeException("Unsupported pay type");
}
}
//将原本主类中复杂的逻辑业务剥离出来并封装进静态工厂方法中
//此时主类中只需要:
public class OrderService {
public void payOrder(String orderId, String payType) {
// 只需要这一行!传入参数,拿到对象。干净利落!
Payment payment = PaymentFactory.createPayment(payType);
}
}
十分的优秀且便捷,我们称之为:高效