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

设计模式系列

创建型设计模式

Java 设计模式之单例模式

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

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

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

Java 设计模式之Builder模式

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

结构型设计模式

Java 设计模式之代理模式

Java 设计模式之外观模式

前言

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

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

定义的对比

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

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

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

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

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

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

UML图的对比

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


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

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

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

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

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

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

图 4    Builder 模式 示例的 UML 类图

Builder 模式 示例的 UML 类图

总结

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

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

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

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

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

后记

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


感谢

  • 《Android源码设计模式解析与实战》 何红辉 关爱民
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值