### 前言
Builder(構造者)模式也是一種常用的設計模式,它是用來一步一步構建復雜事物而設計的模式,使用這種模式可以使得**復雜事物的構建與展示相分離**,具有降低耦合,向外部隱藏復雜事物的構建過程等優點。
Builder模式的使用場景:
?(1)相同的方法,不同的執行順序,產生不同的結果;
?(2)多個部件或零件,屬性都可以裝配到一個對象中,但是產生的運行又不相同;
?(3)產品類非常復雜,或者產品類中的調用順序不同產生不同的作用,這個時候用Builder模式非常合適;
?(4)當初始化一個對象特別復雜,如:參數屬性多,且很多參數都有默認值。
### Builder模式的實現
以生產汽車為例展示Builder模式的過程。我們知道汽車有很多零件,什么方向盤,發動機,輪子等等,同時它還有一個屬性,如:名稱,價格,級別等。這些都要汽車生產商來完成,那么汽車生產商就是Builder。汽車生產好了以后要投入市場出售,這時汽車會在汽車商城展示。
1、汽車 –>要構建的復雜的事物
~~~
public class Car {
private String name; // 名稱:寶馬,奔馳,奧迪...
private String price; // 價格,3萬,10萬...
private String grade; // 級別,小型車,中型車,大型車
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + ", grade=" + grade
+ "]";
}
}
~~~
這里只為了展示Builder模式,所以不涉及零件或者屬性等具體的實現。
2、汽車生產商–>CarBuilder.java
~~~
public class CarBuilder {
private String name;
private String price;
private String grade;
/**
* 構造名稱
*/
public CarBuilder buildName(String name){
this.name = name;
return this;
}
/**
* 構造價格
*/
public CarBuilder buildPrice(String price){
this.price = price;
return this;
}
/**
* 構造級別
*/
public CarBuilder buildGrade(String grade){
this.grade = grade;
return this;
}
/**
* 生產汽車
*/
public Car create(){
Car car= new Car();
car.setName(name);
car.setPrice(price);
car.setGrade(grade);
return car;
}
}
~~~
通常來說,Builder的setter會返回自身this,這樣可以實現鏈表式操作,這里的CarBuilder代表汽車生產商,模擬汽車的生產過程。
3、汽車商城(展示汽車)–>CarShow.java
~~~
public class CarShow {
private CarBuilder builder;
public CarShow(CarBuilder builder){
this.builder = builder;
}
public Car getCar(){
return builder.create();
}
}
~~~
這一步有時候也往往會省略,即只有Builder,這只實現汽車的一個展示的過程,客戶也可以直接去汽車生產商那買汽車,不用去汽車商城買汽車。
4、客戶挑選汽車–>Test.java
~~~
public class Test {
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
builder.buildName("寶馬");
builder.buildPrice("100萬");
builder.buildGrade("小型車");
Car car = builder.create();
System.out.println(new CarShow(builder).getCar());
}
}
~~~
結果:

即:客戶實際看到的汽車是100萬的小型車寶馬
總結:上面的這些就是Builder的過程,通常就是兩步,即:構建和展示。有時候會省略展示的過程,直接由構建者Builder完成構建和展示。上面的例子不是為了初始化一個Car對象而是為了通過這種模式模擬實現汽車的構造和展示相分離。如果我們將Builder設置成一個接口或者抽象類,那么傳入不同的Buidler就可以得到不同的汽車,這樣一來這種模式的靈活性和可擴展性就大大提高了,而且耦合性非常低。