考慮今天您要建立一個車庫,您已經構想好一個基本的車庫藍圖,這個車庫的功能很簡單,有一個屋頂、四面牆,其中一面牆設有一個車子進出的門,因為預算的關係,這個車庫要用哪些材質來建立您還沒有決定,您找了兩個建車庫的人,其中一個可以幫您建立一個實用的車庫,但索價較高,另一個的索價較低,但所用的材質都是木頭而已。
無論如何您最終的選擇是什麼,建車庫的人只要按照您的藍圖來建車庫,功能上都是可以達到您的要求的,您這時所扮演的是指導者(Director)的角色,而建車庫的人是建築者(Builder),假設以上所述是一個模擬遊戲中的情節,我們可以使用建築者模式來構造我們的程式結構,如下圖所示:
在這邊我們所觀注的是建立屋頂、牆、門這些元件(component)的操作方法,對身為設計者的您而言,這三個方法必須合乎您的設計藍圖,我們簡單的將這個結構實現如下:
public class Designer {
private String[] blueprint = {"牆", "屋頂", "門"};
public void buildGarage(GarageBuilder builder) {
for(int i = 0; i < blueprint.length; i++) {
if (blueprint[i].equals("牆"))
builder.makeWall();
else if (blueprint[i].equals("屋頂"))
builder.makeRoof();
else if (blueprint[i].equals("門"))
builder.makeDoor();
}
}
}
public abstract class GarageBuilder {
private Designer builder;
public abstract void makeWall();
public abstract void makeDoor();
public abstract void makeRoof();
public abstract void printGarage();
}
public class CheapBuilder extends GarageBuilder {
private String _cheapGarage = "便宜車庫 = ";
public void makeWall() {
_cheapGarage = _cheapGarage + "四個木牆 ";
}
public void makeRoof() {
_cheapGarage = _cheapGarage + "一個木屋頂 ";
}
public void makeDoor() {
_cheapGarage = _cheapGarage + "一個木門 ";
}
// 這只是顯示成品而已
public void printGarage() {
System.out.println("成品: " + _cheapGarage);
}
}
public class PracticalBuilder extends GarageBuilder {
private String _practicalGarage = "實用車庫 = ";
public void makeWall() {
_practicalGarage = _practicalGarage + "四個水泥牆 ";
}
public void makeRoof() {
_practicalGarage = _practicalGarage + "一個鐵屋頂 ";
}
public void makeDoor() {
_practicalGarage = _practicalGarage + "一個電動門 ";
}
// 這只是顯示成品而已
public void printGarage() {
System.out.println("成品: " + _practicalGarage);
}
}
public class Main {
public static void main(String[] args) {
Designer you = new Designer();
GarageBuilder builder = new CheapBuilder();
you.buildGarage(builder);
// 這只是顯示成品而已
builder.printGarage();
}
}
在我們的結構圖中,有生成實質的車庫產品,而在上面的簡單實現中,只是用字串簡單的實現而已,當然,如果您的產品提供操作,您也可以設計一個抽象介面,並透過抽象介面來操作實現的子類別,您可以使用之前談過的相關模式,或是其它模式來定義與實作您的產品,這就看您的程式要用這個產品作些什麼了。
我們將建築者模式的結構畫出如下:
在Gof(Gang of four)中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉換為其它的格式,以DOC文件剖析器為例好了,假設我們希望析剖器可以將DOC文件轉換為RTF或是PDF文件,我們可以如下設計結構:
簡單來說,建築者模式適用的場合,在於使得相同的建築過程可以建立不同的實例,這是其之所以命為Builder的原因。
Learn more or evaluate Confluence for your organisation.