1、概念
与工厂模式大部分相同,区别在于工厂模式”封装”复杂的类结构,而构建者模式”封装”复杂的对象创建流程。
这样做的目的是:
- 对于框架设计者而言,”封装”复杂的对象创建流程,使得框架使用者在使用这些对象时,无需关注”如何创建它”,而只需关注”如何使用它”。
- 对于接口规范制定者,可以规范对象的创建流程,而由不同厂商提供具体的实现。
对于只需要通过new创建,或者直接可以使用spring框架获取的类,无需使用构建者模式。
它的解决方案:
- 对于框架设计者而言,通常将类名定义为XXBuilder,该类提供build方法,该方法的返回值为所需对象。
- 对于第二种场景,接口规范制定者需要明确对象的创建流程,并将这些流程分解为一系列的方法。
2、UML图
3、代码
构建者接口
/** * * @File Name: IBuilder.java * @Description: 构建者接口 * @version 1.0 * @since JDK 1.8 */ public interface IBuilder { /** * * @Title: step1 * @Description:第一步 */ void step1(); /** * * @Title: step2 * @Description:第二步 */ void step2(); /** * * @Title: step3 * @Description:第三步 */ void step3(); Product build(); }
接口实现类
/** * * @File Name: BuilderImpl.java * @Description: 构建者接口实现类 * @version 1.0 * @since JDK 1.8 */ public class BuilderImpl implements IBuilder { @Override public void step1() { } @Override public void step2() { } @Override public void step3() { } @Override public Product build() { } }
4、讨论
问题1:它的主要功能是什么?
答:它的主要功能是”封装”在创建对象时的复杂流程。
问题2:它与工厂模式的区别是什么?
答:它与工厂模式的功能都是相同的,都是用于创建对象,本质在于程序抽象的现实问题的区别。
举个示例,假设将框架设计者比作厨师,框架调用者比作饭店的顾客,此时作为调用者要做的事情只是打开菜单点餐,至于厨师的做饭过程不是我关心的。而作为厨师,顾客点餐之后,我需要准备食材,烧水,炒菜等一系列流程最终的产品就是顾客点的食物。构建者模式中,接口调用者不需了解对象复杂的创建流程,而只需要关注对象本身的功能即可。
对于工厂模式,它是对复杂类结构的”封装”。举个示例,对于汽车,电脑等这些我并不关心每个部件从哪里来的,以及它是如何组装到一起的,我在乎的只是车的功能。工厂模式中,接口调用者无需关心对象组装的”细节”,而只需要关注对象本身的功能即可。
5、示例
- Quartz框架中的JobBuilder
- Mybatis框架中的SqlSessionFactoryBuilder
大部分名称以Builder结尾,有build方法基本都是构建者模式的例子。个人建议可以尝试制作蛋糕的流程模拟为Java程序。