生成器(Builder)

[TOC]

意图

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

适用性

在以下情况使用 Builder 模式:

结构

Builder 模式结构如下图所示:

1564478622902

参与者

Builder
ConcreteBuilder
Director
Product

协作

下面的交互图说明了Builder和Director是如何与一个客户协作的:

1564478906505

效果

Builder模式的主要效果:

实现

通常有一个抽象的Builder类为导向者可能要求创建的每一个构件定义一个操作。

这些操作缺省情况下什么都不做。

一个ConcreteBuilder类对它有兴趣创建的构件重定义这些操作。

示例一:以不同方式生成列表

1564555077853

示例二:模拟电脑的生产或者组装

经典Buider模式中有四个角色:

  1. 要建造的产品Product – 组装的电脑 Computer.java
  2. 抽象的Builder – 装CPU、内存条、硬盘等抽象的步骤 ComputerConfigBuilder.java
  3. Builder的具体实现ConcreteBuilder – 对上述抽象步骤的实现,比如装i5CPU、8G内存条、1T硬盘
  4. 使用者Director – 电脑装机人员 Director.java
  5. 测试入口 ExampleMain.java

1564555131466

示例三:创建一个不可变的Person对象,其中名字和性别是必须的

由于这个Person对象是不可变的,所以毫无疑问我们给他的所有属性都加了final修饰,当然如果没有不可变的需求也是可以不加的,然后在Person类中定义一个内部类Builder,这个Builder内部类中的属性要和Person中的相同,并且必须有的属性要用final修饰,防止这些属性没有被赋值,其他非必须的属性不能用final,因为如果加了final,就必须对其进行初始化,这样这些非必须的属性又变成必须的。然后内部类中定义了一个构造方法,传入必须有的属性。其他非必须的属性都通过方法设置,每个方法都返回Builder对象自身。最后定义了一个build方法,将Builder对象传入Person的私有构造方法,最终返回一个对象。

1564555194270