## **模式的定义**
定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
## **代码实现**
需求:一家制作机器人的厂商需要打造一个机器人,那么可以把一整个构造过程分解为
```
1. 创建机器人身体
2. 创建机器人头部
3. 创建机器人四肢
4. 最后组装成一个完整的机器人
```
代码实现
1. 创建机器人对象
```
public class Robot {
// 头部
private String head;
// 身体
private String body;
// 四肢
private String limbs;
// get set
...
}
```
2. 定义一个构建机器人的标准接口
```
public interface RobotBuilder {
// 创建头部
void buildHead();
// 创建身体
void buildBody();
// 创建四肢
void buildLimbs();
// 组装
Robot buildRobot();
}
```
3. 定义完标准接口后,我们需要根据不同的需求来实现这个接口,比如创建一个男性的机器人
```
public class MaleRobotBuilder implements RobotBuilder {
private Robot robot;
// 构造行数初始化机器人对象
public MaleRobotBuilder() {
this.robot = new Robot();
}
@Override
public void buildHead() {
robot.setHead("男性:头大");
}
@Override
public void buildBody() {
robot.setBody("男性:身体大");
}
@Override
public void buildLimbs() {
robot.setLimbs("男性:四肢粗壮");
}
@Override
public Robot buildRobot() {
return robot;
}
}
```
4. 创建一个总工程师类来完成对机器人的组装
```
public class RobotDirector {
public Robot construct(RobotBuilder robotBuilder) {
robotBuilder.buildBody();
robotBuilder.buildHead();
robotBuilder.buildLimbs();
return robotBuilder.buildRobot();
}
}
```
5. 客户端调用
```
public static void main(String[] args) {
// 指定建造一个男性的机器人
MaleRobotBuilder builder = new MaleRobotBuilder();
// 实例化总工程师
RobotDirector director = new RobotDirector();
// 组装
Robot robot = director.construct(builder);
System.out.println(robot.getBody());
System.out.println(robot.getHead());
System.out.println(robot.getLimbs());
}
```
## **总结**
建造者模式中主要有以下四个角色:
1. Product:要创建的复杂对象(Robot)。
2. Builder:一个抽象接口,规范复杂对象的各个组成部分(RobotBuilder)。
3. ConcreteBuilder:针对不同的业务,实现Builder接口,具体实现各个复杂的功能,在建造完成后提供产品实例。
4. Director:总工程师,负责把各个复杂的部分按顺序组装成一个完整产品
使用场景:
1. 需要生成的对象具有复杂的内部结构。
2. 需要生成的对象内部属性本身相互依赖。
与工厂方法的区别:
工厂方法模式注重的是**整体对象的创建方法**,而建造者模式注重的是**部件构建的过程**,旨在通过一步一步地精确构造创建出一个复杂的对象。工厂模式关心整体,建造者模式关心细节。比如我们举例的机器人厂商,假如要建造一个机器人,工厂模式直接就能建造出一个机器人,而不需要关心细节。而建造者模式,则需要先构建头部,身体,四肢,再最后按顺序组装成一个机器人。