java23種設計模式——五、建造者模式
阿新 • • 發佈:2020-08-28
原始碼在我的[github](https://github.com/witmy/JavaDesignPattern)和[gitee](https://gitee.com/witmy/JavaDesignPattern)中獲取
# 目錄
[java23種設計模式—— 一、設計模式介紹](https://www.cnblogs.com/codermy/p/13565137.html)
[java23種設計模式—— 二、單例模式](https://www.cnblogs.com/codermy/p/13566365.html)
[java23種設計模式——三、工廠模式](https://www.cnblogs.com/codermy/p/13569486.html)
[java23種設計模式——四、原型模式](https://www.cnblogs.com/codermy/p/13571750.html)
[java23種設計模式——五、建造者模式](https://www.cnblogs.com/codermy/p/13575590.html)
# 建造者模式
建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
一句話概括就是建造者模式的目的是為了**分離複雜物件的屬性與建立過程**。
## 一、介紹
**意圖:** 將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
**主要解決:** 主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。
**何時使用:** 一些基本部件不會變,而其組合經常變化的時候。
**如何解決:** 將變與不變分離開。
**關鍵程式碼:** 建造者:建立和提供例項,導演:管理建造出來的例項的依賴關係。
**應用例項:** 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。
**優點:** 1、建造者獨立,易擴充套件。 2、便於控制細節風險。
**缺點:** 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
**使用場景:** 1、需要生成的物件具有複雜的內部結構,這些產品物件通常包含多個成員屬性。 2、需要生成的物件內部屬性本身相互依賴。
**注意事項:**與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
以上部分根據[菜鳥教程](https://www.runoob.com/design-pattern/builder-pattern.html)修改
## 二、實現
我們知道一個電腦生產出來是需要很多部件的,例如cpu,顯示卡,硬碟,螢幕,主機板等等。
新建一個Computer類
```java
/**
* @author codermy
* @createTime 2020/7/24
*/
@Data
public class Computer {
private String mainBoard;//主機板
private String cpu;//cpu
private String ideoCard;//顯示卡
private String hardDisk;//硬碟
private String memorie; //記憶體條
}
```
在生成一個用於建造電腦工序的類
```java
/**
* @author codermy
* @createTime 2020/7/24
* 一臺電腦需要完成的工序
*/
public interface ComputerBuilder {
void buildMainBoard();
void buildCpu();
void buildIdeoCard();
void buildHardDisk();
void buildMemorie();
// 建造結果
Computer build();
}
```
現在一共可以成產兩種電腦,分別是飛行堡壘 和 拯救者。
飛行堡壘製作工序
```java
/**
* @author codermy
* @createTime 2020/7/24
* 飛行堡壘6
*/
public class ComputerA implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildMainBoard() {
computer.setMainBoard("X550JK");
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i5");
}
@Override
public void buildIdeoCard() {
computer.setIdeoCard("GTX1060");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("256GB+1TB混合硬碟");
}
@Override
public void buildMemorie() {
computer.setMemorie("DDR4 8GB×1");
}
@Override
public Computer build() {
return computer;
}
}
```
拯救者製作工序
```java
/**
* @author codermy
* @createTime 2020/7/24
* 拯救者
*/
public class ComputerB implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildMainBoard() {
computer.setMainBoard("15Isk");
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i7");
}
@Override
public void buildIdeoCard() {
computer.setIdeoCard("GTX1050Ti");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("256GB+1TB混合硬碟");
}
@Override
public void buildMemorie() {
computer.setMemorie("DDR4 16GB×1");
}
@Override
public Computer build() {
return computer;
}
}
```
新建一個指揮者來指揮完成相應的製作流程
```java
public class Conductor {
private ComputerBuilder computerBuilder;
public void setComputerBuilder(ComputerBuilder computerBuilder){
this.computerBuilder = computerBuilder;
}
// 指揮建造過程
public Computer make(){
computerBuilder.buildMainBoard();
computerBuilder.buildCpu();
computerBuilder.buildHardDisk();
computerBuilder.buildIdeoCard();
computerBuilder.buildMemorie();
return computerBuilder.build();
}
}
```
客戶要求
```java
/**
* @author codermy
* @createTime 2020/7/24
* 客戶
*/
public class Client {
public static void main(String[] args) {
// 一個指揮者
Conductor conductor = new Conductor();
// 需要ComputerA 飛行堡壘
ComputerA fxbl = new ComputerA();
// 指揮建造ComputerA
conductor.setComputerBuilder(fxbl);
// 得到飛行堡壘
Computer computer1= conductor.make();
System.out.println(computer1);
// 一個指揮者
Conductor conductor2 = new Conductor();
// 需要ComputerA 拯救者
ComputerB zjz = new ComputerB();
// 指揮建造ComputerB
conductor2.setComputerBuilder(zjz);
// 得到拯救者
Computer computer2= conductor2.make();
System.out.println(computer2);
}
}
```
輸出
```bash
Computer(mainBoard=X550JK, cpu=Intel Core i5, ideoCard=GTX1060, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 8GB×1)
Computer(mainBoard=15Isk, cpu=Intel Core i7, ideoCard=GTX1050Ti, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 16GB