在 Java 开发中,对象的创建是一个常见的场景,如果对象的创建和使用都写在一起,代码的耦合度高,也不利于后期的维护。我们可以使用工厂模式来解决这个问题,工厂模式是一个创建型模式,将对象的创建和使用分离开来,降低代码的耦合度,提高程序的可维护性和扩展性。
电商平台下单之后,支付需要可以选择不同的支付的方式,比如拼多多下单后,就会有以下的支付方式:
工厂模式定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
首先定义一个支付接口,以及几个实现类,比如微信支付,支付宝支付:
// 支付接口
public interface Pay {
void pay();
}
// 支付宝支付
public class AliPay implements Pay{
@Override
public void pay() {
System.out.println("支付宝支付 .....");
}
}
// 微信支付
public class WechatPay implements Pay{
@Override
public void pay() {
System.out.println("微信支付 .....");
}
}
没使用工厂模式之前,一个下单方法里面包含创建订单、支付、更新订单方法,所以代码都冗余到了一起:
public void order(int payType) {
// 创建订单
// 省略代码......
// 根据type 调用不同的支付
Pay pay;
if (payType == 1) {
pay = new AliPay();
} else {
pay = new WechatPay();
}
// 调用支付
pay.pay();
// 更新状态 代码省略.....
}
以上代码耦合度很高,有以下几个缺点:
将 order 方法的支付代码抽取到工厂类中:
// 支付工厂类
public class PayFactory {
public static Pay getPay(int payType) {
Pay pay;
if (payType == 1) {
pay = new AliPay();
} else {
pay = new WechatPay();
}
return pay;
}
}
经过重构之后的 order 方法,支付直接调用 PayFactory 工厂类,代码逻辑更加清晰,可读性也更强了:
public void order2(int payType) {
// 创建订单
// 省略代码......
// 根据type 调用不同的支付
Pay pay = PayFactory.getPay(payType);
// 调用支付
pay.pay();
// 更新状态 代码省略.....
}
引入工厂模式之后,代码有如下的优点:
需要注意的是,上面示例类只有一个方法,仅仅是因为方便,还可以写其他方法,因为工厂模式重点是对象的创建,所以可以包含多个方法。
工厂模式作为场景的一种设计模式,在 JDK 使用也比较广泛,这里就介绍几种使用示例。
Calendar 类提供了大量跟日期相关的功能代码,Calendar 是一个抽象类,通过调用 Calendar.getInstance() 来获取对象,最终会调用 createCalendar方法,来看一下源码:
从代码可以看出 getInstance 根据 TimeZone 和 Locale 的不同的,返回不同的 Calendar 子类对象,比如 BuddhistCalendar、JapaneseImperialCalendar。将对象的创建封装成一个工厂方法,调用只需要传递当时时区和地址,就能获取到对应的对象了,无需关心对象是如何创建的。
感觉不错的话,点点关注
手机扫一扫
移动阅读更方便
你可能感兴趣的文章