工厂模式

工厂模式:

  简单工厂:是产品的工厂

  工厂方法:工厂的工厂

  抽象工厂:复杂产品的工厂


简单工厂模式:Simple Factory Pattern, SFP

  由一个工厂对象决定创建出哪一种产品类的实例

  但它不属于 GOF 23(四人组)

  适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数

  工厂类可结合反射、泛型进行代码优化

  JDK中的体现:
    Calendar.getInstance()
    LoggerFactory.getLogger()

  缺点:
   工厂类的职责相对过重,不易于扩展过于复杂的产品结构

  源码:
   pattern.factory.simplefactory


============================================================================

工厂方法模式:Fatory Method Pattern, FMP

  定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

  符合开闭原则

  主要解决产品扩展问题

  根据单一职责,拆分专人干专事,不同的产品由不同的工厂类创建,对工厂本身也做一个抽象


  JDK中的体现:
    LoggerFactory.getLogger()
    Logger

  适用场景:
  创建对象需要大量的重复代码
  客户端(应用层)不依赖于产品类实例如何被创建的、实现等细节
  一个类通过其子类来指定创建哪个对象

  缺点:
    类的个数过多,增加复杂度(系统抽象性、理解难度)

  源码:
    pattern.factory.factorymethod


============================================================================

抽象工厂模式:Abastract Factory Pattern, AFP

  提供一个创建一系列相关或相互依赖对象的接口,无须指定她们具体的类。

  需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

  讲解抽象工厂前,需要了解两个概念:产品等级结构和产品族
  产品族与产品等级结构的关系图?

  源码:
  pattern.factory.abstractfactory

  如:描述两个产品族 Java课程和 Python课程,也描述两个产品等级 视频和笔记。
  继续扩展产品等级,将源码也加到课程中,代码从抽象工厂到具体工厂全部都要调整

  不符合开闭原则

  缺点:
  规定了所有可能被创建的产品集合,产品族中拓展新的产品困难,需要修改抽象工厂接口

  增加系统抽象性和理解难度

  实际应用中,千万不能犯强迫症,在实际需求中产品等级升级是非常正常的意见事情。
  可以根据实际情况,只要不是频繁升级,可以不遵循开闭原则。

  代码每半年升级一次或每年实际一次 由有何不可呢?


============================================================================

工厂模式实践案例

  JDBC 操作案例

  为了避免每次操作都需要重新创建数据库连接(非常耗性能,消耗业务调用时间)
  利用工厂模式,将数据库连接预先创建好放到容器中缓存起来,业务调用时只需要现取现用。

  源码:
  sqlhelper.org.jdbc.sqlhelper


作业:
  1.工厂类一定需要将构造方法私有化吗,为什么?

  2.用工厂模式设计支付业务场景,包含跨境支付,支付宝、微信、银联支付,并画出类图。

  /homework/subjects/7e7e7f7ff7g5dgc2g6fgf9


posted @ 2020-05-07 11:16  离散音符  阅读(158)  评论(0编辑  收藏  举报