Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别

设计模式系列

创建型设计模式

Java 设计模式之单例模式

Java 设计模式之静态工厂方法模式

Java 设计模式之工厂方法模式

Java 设计模式之抽象工厂模式

Java 设计模式之Builder模式

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别

结构型设计模式

Java 设计模式之代理模式

Java 设计模式之外观模式

文章目录

    • 设计模式系列
      • 创建型设计模式
      • 结构型设计模式
    • 前言
    • 定义的对比
    • UML图的对比
    • 总结
    • 后记
    • 感谢

前言

前面几篇文章,我们依次学习分析了静态工厂方法模式、工厂方法模式、抽象工厂模式和 Builder 模式,我们发现他们 都可以用来得到一个产品 ,那他们有什么区别呢?当我们需要的时候,该怎么选择呢?

本讲我们来对比一下他们的区别。

定义的对比

我们先从前面几篇文章中拿来定义对比看看。

静态工厂方法模式:由一个工厂类对象决定创建哪一种产品类的实例。

工厂方法模式:定义一个用于创建产品对象的接口,让其子类决定实例化哪个产品类

抽象工厂模式:为创建一组相关或者相互依赖的产品对象提供一个接口,而不需要指定他们的具体类。

Builder 模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

我将定义中的关键处做了加粗。

UML图的对比

在前面几篇文章中,都提供的有示例,我们贴一下这些示例的 UML 图,对比一下。


图 1    静态工厂方法模式 示例的 UML 类图

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别_第1张图片

图 2    工厂方法模式 示例的 UML 类图

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别_第2张图片

图 3    抽象工厂模式 示例的 UML 类图

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别_第3张图片

图 4    Builder 模式 示例的 UML 类图

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别_第4张图片

总结

代码示例在前几篇文章里都有,这里就不贴了,还没看或者记不清楚的小伙伴自行翻回去熟悉。

下面我们结合定义、UML 图,及前面的代码,总结他们的区别。

我们之前有讲,静态工厂方法模式是工厂方法模式的精简版,其区别可以概括如下:
1、静态工厂方法模式,是在一个工厂类中,通过方法入参的不同生成不同的产品;
2、工厂方法模式,是有一个工厂的抽象类或者接口,由其子类生成具体的产品,且一个工厂子类只能生成一种产品。

那么,抽象工厂模式呢?实际上可以认为它是工厂方法模式的升级版。
1、工厂方法模式,包括静态工厂方法模式,都是用来生成独立的产品(不同工厂子类生成的产品间没有相关或者依赖关系);
2、抽象工厂模式,也是有一个工厂的抽象类或者接口,里面声明了一系列方法,用来规范 ”生产多个不同类型的、相关联或者相依赖的产品“ 的行为,再由其子类去实现这些方法(比如示例中的月饼皮和月饼馅,或者电脑的显示器和主板等)。

那这些工厂模式与 Builder 模式的区别呢?
1、工厂模式,关注的是创建的产品,即创建什么类型的产品;
2、Builder 模式,关注的是产品的创建过程,即怎么创建。
我们说 Builder 模式是将对象的构建与表示相分离。或许我们可以这样理解:Builder 模式侧重的是构建,而工厂模式侧重的是表示

后记

GOF 提出的 23 种设计模式中,创建型设计模式占了 5 种,分别为:单例模式、工厂方法模式、抽象工厂模式、Builder 模式、原型模式。原型模式我暂时没打算关注,下一讲我们学习 代理模式


感谢

  • 《Android源码设计模式解析与实战》 何红辉 关爱民

你可能感兴趣的:(架构设计)