首页 > 编程语言 >Java 设计模式实战系列—工厂模式

Java 设计模式实战系列—工厂模式

时间:2023-06-30 09:00:44浏览次数:43  
标签:实战 调用 Java pay 代码 支付 工厂 创建 设计模式

在 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 中的应用

工厂模式作为场景的一种设计模式,在 JDK 使用也比较广泛,这里就介绍几种使用示例。

Calendar.getInstance

Calendar 类提供了大量跟日期相关的功能代码,Calendar 是一个抽象类,通过调用 Calendar.getInstance() 来获取对象,最终会调用 createCalendar方法,来看一下源码:

从代码可以看出 getInstance 根据 TimeZone 和 Locale 的不同的,返回不同的 Calendar 子类对象,比如 BuddhistCalendar、JapaneseImperialCalendar。将对象的创建封装成一个工厂方法,调用只需要传递当时时区和地址,就能获取到对应的对象了,无需关心对象是如何创建的。

总结

  • 在 Java 开发中如果将对象的创建和使用耦合在一起,不利于后期的维护,这就需要引入工厂模式。
  • 工厂模式将对象的创建和使用分离,降低代码的耦合度。
  • 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  • 引入工厂模式之后,调用方无需关注对象的创建过程,根据传参调用对应的实例对象,后续新增或更新对象只需要修改工厂方法即可,降低代码的维护成本。

参考

感觉不错的话,点点关注

标签:实战,调用,Java,pay,代码,支付,工厂,创建,设计模式
From: https://www.cnblogs.com/jeremylai7/p/17515686.html

相关文章

  • MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端
    前言前面的章节我们介绍了一些值得推荐的BlazorUI组件库,通过该篇文章的组件库介绍最终我选用AntDesignBlazor这个UI框架作为ToDoList系统的前端框架。因为在之前的工作中有使用过AntDesignVue、AntDesignAngular习惯并且喜欢AntDesign设计规范和风格,废话不多说今天我......
  • Java标识符和关键字
    关键字关键字关键字关键字关键字abstractassertbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseenumextendsfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewpackag......
  • Java基础
    Java基础1.注释、标识符、关键字1.单行//2.多行/**/3.文档注释JavaDoc/***/4.标识符_关键词不可以作为变量名5.标识符_只能以字母\$\_开头6.变量名是大小写敏感的2.数据类型1.强类型语言_变量的使用严格符合规定(安全性高)2.基本类型......
  • Java异常2
    Java异常2如果try没有遇到问题,怎么执行?会把try里面所有代码执行完毕,不会执行catch()里面的内容.publicclassMain7{publicstaticvoidmain(String[]args){intarr[]={1,2,3,4,5,6};try{System.out.println(arr[0]);......
  • java反序列化漏洞原理
    1.首先是序列化的过程序列化:ObjectOutputStream类-->writeObject()将对象进行序列化,把字节序列写到一个目标输出流中.ser2.反序列化反序列化:ObjectInputStream类-->readObject()从一个源输入流中读取字节序列,再把它们反序列化为一个对象 如果序列化字节序列内容......
  • Java基础-Day06
    Java基础-Day06多维数组如何理解二维数组?数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则次数组称为二维数组二维数组的属性:int[][]arr3=newint[][]{{1,2,3,4},{4,5,6,7,8},{9,10}};Syste......
  • 亚马逊国际获得AMAZON商品详情API接口采集sku商品规格信息列表Java调用演示案例
    ​亚马逊商品详情API接口的作用是获取Lazada电商平台上的某一商品的详情信息,包括商品的名称、销售价格、库存数量、图片、商品描述、品牌、产地、售后保障等信息。开发者可以使用该API接口获取到商品的原始数据,进行分析、筛选等操作。通过该接口获取到的商品详情数据可以结合其......
  • 广州丨阿里云 Serverless 技术实战营邀你来玩!
    活动简介“Serverless技术实战与创新沙龙”是一场以Serverless为主题的开发者活动,活动受众以关注Serverless技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手实操,让开发者通过一个下午的时间增进对Serverless技术的理解,快速上手Serverless,拥抱云......
  • Java连接MQ集群
    Java代码创建仲裁队列点击查看代码@BeanpublicQueuequorumQueue(){returnQueueBuilder.durable("cluster.quorum.queue").quorum().build();}......
  • Java获取数据库的列名、列数、标题、类型等信息, ResultSetMetaData
    importjava.sql.*;publicclassjdbcTest{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{//1、加载驱动Class.forName("com.mysql.jdbc.Driver");//2、用户信息和urlStringurl="......