• 工厂模式


    工厂模式:

      简单工厂:是产品的工厂

      工厂方法:工厂的工厂

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


    简单工厂模式: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


  • 相关阅读:
    递归
    简单装饰器
    带函数参数的装饰器(复杂装饰器)的例子
    (转)MySQL 线程池内幕
    (转)http://blog.csdn.net/renfufei/article/details/38474435
    (转)RabbitMQ 中文文档
    (转) rabbitmq应用场景
    (转) Rabbitmq学习笔记
    (转)更换镜像rootvg卷组中的硬盘
    (转)AIX下镜像制作与取消,更换硬盘问题
  • 原文地址:https://www.cnblogs.com/fightingtong/p/12841696.html
Copyright © 2020-2023  润新知