设计模式系列
创建型设计模式
Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别
结构型设计模式
前言
前面几篇文章,我们依次学习分析了静态工厂方法模式、工厂方法模式、抽象工厂模式和 Builder 模式,我们发现他们 都可以用来得到一个产品 ,那他们有什么区别呢?当我们需要的时候,该怎么选择呢?
本讲我们来对比一下他们的区别。
定义的对比
我们先从前面几篇文章中拿来定义对比看看。
静态工厂方法模式:由一个工厂类对象决定创建哪一种产品类的实例。
工厂方法模式:定义一个用于创建产品对象的接口,让其子类决定实例化哪个产品类。
抽象工厂模式:为创建一组相关或者相互依赖的产品对象提供一个接口,而不需要指定他们的具体类。
Builder 模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
我将定义中的关键处做了加粗。
UML图的对比
在前面几篇文章中,都提供的有示例,我们贴一下这些示例的 UML 图,对比一下。
总结
代码示例在前几篇文章里都有,这里就不贴了,还没看或者记不清楚的小伙伴自行翻回去熟悉。
下面我们结合定义、UML 图,及前面的代码,总结他们的区别。
我们之前有讲,静态工厂方法模式是工厂方法模式的精简版,其区别可以概括如下:
1、静态工厂方法模式,是在一个工厂类中,通过方法入参的不同生成不同的产品;
2、工厂方法模式,是有一个工厂的抽象类或者接口,由其子类生成具体的产品,且一个工厂子类只能生成一种产品。
那么,抽象工厂模式呢?实际上可以认为它是工厂方法模式的升级版。
1、工厂方法模式,包括静态工厂方法模式,都是用来生成独立的产品(不同工厂子类生成的产品间没有相关或者依赖关系);
2、抽象工厂模式,也是有一个工厂的抽象类或者接口,里面声明了一系列方法,用来规范 ”生产多个不同类型的、相关联或者相依赖的产品“ 的行为,再由其子类去实现这些方法(比如示例中的月饼皮和月饼馅,或者电脑的显示器和主板等)。
那这些工厂模式与 Builder 模式的区别呢?
1、工厂模式,关注的是创建的产品,即创建什么类型的产品;
2、Builder 模式,关注的是产品的创建过程,即怎么创建。
我们说 Builder 模式是将对象的构建与表示相分离。或许我们可以这样理解:Builder 模式侧重的是构建,而工厂模式侧重的是表示。
后记
GOF 提出的 23 种设计模式中,创建型设计模式占了 5 种,分别为:单例模式、工厂方法模式、抽象工厂模式、Builder 模式、原型模式。原型模式我暂时没打算关注,下一讲我们学习 代理模式 。
感谢
- 《Android源码设计模式解析与实战》 何红辉 关爱民