設(shè)計模式之建造者模式
建造者模式 屬于 創(chuàng)建型模式,提供一種創(chuàng)建對象的最佳方式。
創(chuàng)建型模式 指不是直接使用new的方法,提供另外一種創(chuàng)建對象的方式,并向調(diào)用者隱藏 創(chuàng)建對象的細節(jié),該模式使創(chuàng)建對象更加的靈活。
建造者模式
簡介
將簡單對象一步步的構(gòu)建為復雜的對象。換句話說,就是將復雜的對象的構(gòu)建與表示進行分離。
有順序的創(chuàng)建復雜對象。
模式原理
該模式有四個角色。
- Product:最終生成的對象 產(chǎn)品者
- Builder:構(gòu)建者的抽象基類,定義創(chuàng)建產(chǎn)品的抽象步驟。一般為抽象類(有時會用接口代替)。在其中會有一個返回產(chǎn)品的方法。抽象建造者
- ConcreteBuilder:繼承Builder類,實現(xiàn)抽象方法,該類實現(xiàn)產(chǎn)品的生成。 實際建造者
- Director:該類 指導實際建造者 如何生成產(chǎn)品。 指揮者
UML類圖
該圖片引用于菜鳥教程。

生活實例
可能看這些術(shù)語懵懵的,我們來點與生活相關(guān)的實例。
既然 創(chuàng)建型模式 是創(chuàng)建對象,那我們也來創(chuàng)建一個對象。
比如說,我們現(xiàn)在要創(chuàng)建一個 自行車。

一個自行車 由很多部件組成
假設(shè) 是一個框架,一個座位,還有輪胎組成。
自行車 可能會有不同的廠家生產(chǎn),需要定一個標準,讓各大廠家遵守這個規(guī)則生產(chǎn)。
不同廠家,生產(chǎn)這些部件的方式 可能不同,但都需要實現(xiàn)上面的標準。
光生產(chǎn)這些部件不行,還要把他們組裝起來才能夠用,并且還需要按照一定的順序才行。
這個例子 我們來一一對應四個角色。
自行車-->產(chǎn)品者
標準-->抽象建造者
不同的廠家--> 實際建造者。
部件組裝-->指揮者。
代碼實現(xiàn)
下面我們用代碼來實現(xiàn)上面的思路。
自行車類 產(chǎn)品者
package create.builder.bike;
public class Bike {
private String frame;
private String seat;
private String tire;
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
public String getTire() {
return tire;
}
public void setTire(String tire) {
this.tire = tire;
}
@Override
public String toString() {
return "Bike{" +
"frame='" + frame + '\'' +
", seat='" + seat + '\'' +
", tire='" + tire + '\'' +
'}';
}
}
行業(yè)標準 抽象建造者
//抽象建造者 定義了構(gòu)建產(chǎn)品的步驟
public abstract class Builder {
abstract void buildFrame();
abstract void buildSeat();
abstract void buildTire();
abstract Bike createBike();//返回一個對象的方法
}
不同廠家 實際建造者
摩拜單車(摩拜打錢)
package create.builder.bike;
//摩拜單車
//實際真正的建造者
public class MobikeBuilder extends Builder {
private Bike mBike = new Bike();
@Override
void buildFrame() {
mBike.setFrame("mobike");
}
@Override
void buildSeat() {
mBike.setSeat("mobikeSeat");
}
@Override
void buildTire() {
mBike.setTire("mobikeTire");
}
@Override
Bike createBike() {
return mBike;
}
@Override
public String toString() {
return "MobikeBuilder{" +
"mBike=" + mBike +
'}';
}
}
ofo單車(ofo打錢)
package create.builder.bike;
public class OfoBuilder extends Builder {
private Bike oBike = new Bike();
@Override
void buildFrame() {
oBike.setFrame("OfoBike");
}
@Override
void buildSeat() {
oBike.setSeat("OfoBikeSeat");
}
@Override
void buildTire() {
oBike.setTire("OfoBike");
}
@Override
Bike createBike() {
return oBike;
}
@Override
public String toString() {
return "OfoBuilder{" +
"oBike=" + oBike +
'}';
}
}
部件組裝 指揮者
public class Director {
//傳遞過來真正的建造者。
private Builder mBuilder ;
public Director(Builder builder) {//注入真正的建造者
mBuilder = builder;
}
public Bike construct() {
//告訴具體建造者如何建造產(chǎn)品 最終決定 構(gòu)建的順序。
//控制建造的先后順序 以及返回產(chǎn)品。
mBuilder.buildFrame();
mBuilder.buildSeat();
mBuilder.buildTire();
return mBuilder.createBike();
}
}
模擬客戶 來要車
public class Client {
public static void main(String[] args) {
//客戶 找 指揮者 要車,要什么車 就new 哪個工廠的車。
//然后 生產(chǎn)一個車給客戶。
//客戶完全不要關(guān)心 自行車是怎么創(chuàng)建出來的,只管找指揮者要就行了。
//再次實現(xiàn)了 創(chuàng)建型模式 向調(diào)用者隱藏創(chuàng)建細節(jié)的要求。
Director director = new Director(new MobikeBuilder());
Bike bike = director.construct();
System.out.println(bike.toString());
Director director2 = new Director(new OfoBuilder());
Bike bike2 = director2.construct();
System.out.println(bike2.toString());
}
}
實驗結(jié)果

整理思路
我們再來理一遍思路。
- 客戶 找 指揮者要車
- 指揮者 找 真正的建造者要車部件
- 真正的建造車 生產(chǎn)出車部件給指揮者
- 指揮者 將車部件 按照順序組裝,然后給客戶。
重新思考
我們再來思考之前的那個簡介
建造者模式 是將簡單對象構(gòu)建為復雜對象。
自行車的各個部件是一個簡單對象。
自行車 是一個復雜對象。
在 這個實例中 我為了簡化代碼 是將Frame Seat Tire簡化為String 類型。
實際上 他們也是一個類型。按照實際的話應該這樣寫
privat Frame frame;
privat Seat seat;
privat Tire tire;
我們組裝自行車(復雜對象),就像是搭積木一樣,一個一個部件(簡單對象)的往上面加,之后再構(gòu)成我們想要的自行車(復雜對象)。
建議看完后 自己上手 實際敲一遍,這樣印象更加深刻。
與抽象工廠模式的聯(lián)系
抽象工廠也是生產(chǎn)產(chǎn)品的。它是工廠的工廠,生產(chǎn)的是一系列的獨立的產(chǎn)品。而建造者模式 生產(chǎn)的是不同產(chǎn)品的組裝,是一個組裝好的完整產(chǎn)品。
我們可以將 不同廠家生產(chǎn) 自行車的部件(
MobikeBuilder),使用抽象工廠模式。配件生產(chǎn)工廠
而將自行車的組裝 使用建造者模式。配件組裝工廠
如果不懂抽象工廠,可以去看看我的這篇文章。
作業(yè)實踐
使用建造者模式 生產(chǎn)一臺筆記本電腦。
聲明
本篇文章借鑒于 一篇文章就徹底弄懂建造者模式
特向原作者表示感謝!
如果有任何疑問,請在評論區(qū)留言,我將知無不言言無不盡。
最后,碼字不易。如果本篇文章對你有些許的幫助,還請幫我點個贊,評論一下。
你的贊同是我創(chuàng)作的最大動力。
