Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)

4 简单工厂讲解+coding+源码解析

4.1 简单工厂讲解

  1. 定义:由一个工厂对象决定创建出哪一种产品类的实例;
    类型:创建型,但不属于GOF23种设计模式
    适用场景:
    工厂类负责创建的对象比较少;
    客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
  2. 优点:只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节;
    缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则;无法形成基于继承的产品等级结构;

4.2 coding

  1. 简单工厂更像是一种编码风格和习惯,不属于GOF23种设计模式;
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    通过反射弥补简单工厂扩展性:
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)

4.3 JDK源码解析

  1. Calendar.java类
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
  2. DriverManager、LoggerFactory等;

5 工厂方法讲解+coding+源码解析

5.1 工厂方法讲解

  1. 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行;
    类型:创建型;
  2. 适用场景:
    创建对象需要大量重复的代码;
    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节;
    一个类通过其子类来指定创建哪个对象;
  3. 优点:
    用户只需要关心所需产品对应的工厂,无须关心创建细节;
    加入新产品符合开闭原则,提高可扩展性;
  4. 缺点:
    类的个数容易过多,增加复杂度;
    增加了系统的抽象性和理解难度;

5.2 coding

  1. 工厂方法核心:将创建过程延长到子类进行;
    相同类型的产品:产品等级;
    同一系列产品:产品族;
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
  2. UML图对应角色:
    产品:Video;
    具体产品:Video的3个子类;
    创建者:VideoFactory;
    实际创建者:VideoFactory的3个子类;

5.3 源码解析( jdk + logback )

  1. Collection.java(抽象工厂)中Iterator iterator()(工厂方法);
    ArrayList具体实现工厂,Iterator接口为抽象产品,实际产品为Itr类;
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
  2. URLStreamHandlerFactory抽象工厂;
    Launcher等中的Factory类,工厂;
    URLStreamHandler抽象产品;
    URLStreamHandler的具体实现,具体产品;
  3. ILoggerFactory抽象工厂;

Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
具体的getLogger(String),具体产品;

6 抽象工厂模式讲解+coding+源码解析

6.1 抽象工厂讲解

  1. 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口;
    无须指定它们具体的类;
    类型:创建型;
  2. 适用场景:
    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节;
    强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码;
    提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现;
  3. 优点:
    具体产品在应用层代码隔离,无须关心创建细节(工厂相关都有);
    将一个系列的产品族统一到一起创建;
  4. 缺点:
    规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;
    增加了系统的抽象性和理解难度;
  5. 产品等级结构与产品族:
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
  6. 工厂方法:产品等级结构;
    抽象工厂:产品族;
    根据业务场景选择;

6.2 coding

Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)

  1. 优点:
    应用层代码只和产品族工厂发生关系,不和具体产品发生依赖;
    从产品族工厂取出的产品肯定属于同一产品族;
    产品族扩展性好,符合开闭原则;
  2. 缺点:
    新增产品等级麻烦,违背了开闭原则;
  3. 适合产品等级相对固定的场景;

6.3 源码解析

  1. java.sql.Connection类
    createStatement()返回同一产品族的Statement、Prepared Statement;
  2. java.sql.Statement类
    executeUpdate()返回同一产品族的executeUpdate、resultSet等;

7 建造者模式讲解+coding+源码解析

7.1 建造者模式讲解

  1. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
    用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道;
  2. 类型:创建型;
  3. 适用场景:
    如果一个对象有非常复杂的内部结构(很多属性);
    想把复杂对象的创建和使用分离;
  4. 优点:
    封装性好,创建和使用分离;
    扩展性好、建造类之间独立、一定程度上解耦;
  5. 缺点:
    产生多余的Builder对象;
    产品内部发生变化,建造者都要修改,成本较大;
  6. 建造者模式注重方法的调用顺序,工厂模式注重创建产品,不关心顺序;
    建造者模式可以创建复杂的产品,由各种复杂部件组成,工厂模式创建的产品相似;
    建造者模式不止要创造,还要知道产品由那些部件组成,工厂模式注重把对象创建出来;

7.2 coding

  1. 当创造一个对象需要很多步骤时,适合使用建造者模式;
    当使用一个简单方法可以创建简单对象时,适合使用工厂模式;
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    添加test前
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
    添加test后
  2. 按虚调用、链式调用
    Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)

7.3 建造者模式源码解析

  1. StringBuilder,StringBuffer
  2. jdk + guava + spring + mybatis