Java设计模式精讲—慕课网—课程笔记3(第4章 简单工厂 + 第5章 工厂方法 + 第6章 抽象工厂 + 第7章 建造者模式)
Java设计模式精讲—慕课网—课程笔记3
4 简单工厂讲解+coding+源码解析
4.1 简单工厂讲解
- 定义:由一个工厂对象决定创建出哪一种产品类的实例;
类型:创建型,但不属于GOF23种设计模式
适用场景:
工厂类负责创建的对象比较少;
客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心; - 优点:只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节;
缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则;无法形成基于继承的产品等级结构;
4.2 coding
- 简单工厂更像是一种编码风格和习惯,不属于GOF23种设计模式;
通过反射弥补简单工厂扩展性:
4.3 JDK源码解析
- Calendar.java类
- DriverManager、LoggerFactory等;
5 工厂方法讲解+coding+源码解析
5.1 工厂方法讲解
- 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行;
类型:创建型; - 适用场景:
创建对象需要大量重复的代码;
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节;
一个类通过其子类来指定创建哪个对象; - 优点:
用户只需要关心所需产品对应的工厂,无须关心创建细节;
加入新产品符合开闭原则,提高可扩展性; - 缺点:
类的个数容易过多,增加复杂度;
增加了系统的抽象性和理解难度;
5.2 coding
- 工厂方法核心:将创建过程延长到子类进行;
相同类型的产品:产品等级;
同一系列产品:产品族;
- UML图对应角色:
产品:Video;
具体产品:Video的3个子类;
创建者:VideoFactory;
实际创建者:VideoFactory的3个子类;
5.3 源码解析( jdk + logback )
- Collection.java(抽象工厂)中Iterator iterator()(工厂方法);
ArrayList具体实现工厂,Iterator接口为抽象产品,实际产品为Itr类;
- URLStreamHandlerFactory抽象工厂;
Launcher等中的Factory类,工厂;
URLStreamHandler抽象产品;
URLStreamHandler的具体实现,具体产品; - ILoggerFactory抽象工厂;
具体的getLogger(String),具体产品;
6 抽象工厂模式讲解+coding+源码解析
6.1 抽象工厂讲解
- 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口;
无须指定它们具体的类;
类型:创建型; - 适用场景:
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节;
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码;
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现; - 优点:
具体产品在应用层代码隔离,无须关心创建细节(工厂相关都有);
将一个系列的产品族统一到一起创建; - 缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;
增加了系统的抽象性和理解难度; - 产品等级结构与产品族:
- 工厂方法:产品等级结构;
抽象工厂:产品族;
根据业务场景选择;
6.2 coding
- 优点:
应用层代码只和产品族工厂发生关系,不和具体产品发生依赖;
从产品族工厂取出的产品肯定属于同一产品族;
产品族扩展性好,符合开闭原则; - 缺点:
新增产品等级麻烦,违背了开闭原则; - 适合产品等级相对固定的场景;
6.3 源码解析
- java.sql.Connection类
createStatement()返回同一产品族的Statement、Prepared Statement; - java.sql.Statement类
executeUpdate()返回同一产品族的executeUpdate、resultSet等;
7 建造者模式讲解+coding+源码解析
7.1 建造者模式讲解
- 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道; - 类型:创建型;
- 适用场景:
如果一个对象有非常复杂的内部结构(很多属性);
想把复杂对象的创建和使用分离; - 优点:
封装性好,创建和使用分离;
扩展性好、建造类之间独立、一定程度上解耦; - 缺点:
产生多余的Builder对象;
产品内部发生变化,建造者都要修改,成本较大; - 建造者模式注重方法的调用顺序,工厂模式注重创建产品,不关心顺序;
建造者模式可以创建复杂的产品,由各种复杂部件组成,工厂模式创建的产品相似;
建造者模式不止要创造,还要知道产品由那些部件组成,工厂模式注重把对象创建出来;
7.2 coding
- 当创造一个对象需要很多步骤时,适合使用建造者模式;
当使用一个简单方法可以创建简单对象时,适合使用工厂模式;
添加test前
添加test后 - 按虚调用、链式调用
7.3 建造者模式源码解析
- StringBuilder,StringBuffer
- jdk + guava + spring + mybatis