## **模式的定義**
定義:指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的被稱為建造者模式。它是將一個復雜的對象分解為多個簡單的對象,然后一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
## **代碼實現**
需求:一家制作機器人的廠商需要打造一個機器人,那么可以把一整個構造過程分解為
```
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. 需要生成的對象內部屬性本身相互依賴。
與工廠方法的區別:
工廠方法模式注重的是**整體對象的創建方法**,而建造者模式注重的是**部件構建的過程**,旨在通過一步一步地精確構造創建出一個復雜的對象。工廠模式關心整體,建造者模式關心細節。比如我們舉例的機器人廠商,假如要建造一個機器人,工廠模式直接就能建造出一個機器人,而不需要關心細節。而建造者模式,則需要先構建頭部,身體,四肢,再最后按順序組裝成一個機器人。