Builder Pattern
模式解讀
生活在深圳這所高速發展的城市,高樓大廈林立。所謂萬丈高樓平地起,在我們感慨樓層的高聳之外,更要配服樓層的建造者和設計者。大樓首先得打穩地基、搭建骨架,再由下往上一層層蓋上去。而這樣的架構從程式的設計模式來說有個專用名詞叫:“ Builder ”。
情境類比
由一個固定的建築材料“固定的字串”,然後將這些建築材料組合拼裝,按照樓層的需要建造不同的大樓層,如:商務層、購務層、停車層等“組合拼裝字備份網域控制站串”。
功能示範
測試程式結構圖如下:
UML圖中,共有四個類:
Builder 抽象類別:不含實際處理內容,僅聲明抽象方法。
Director 類:負責產生檔案的類
TextBuilder 類:產生一般檔案格式檔案
HtmlBuilder 類:產生HTML格式檔案
Builder 抽象類別
/**
* 聲明產生“檔案”的所有方法的抽象類別。
*
* @author Administrator
*
*/
public abstract class Builder {
public abstract void makeTitle(String title);//產生檔案中的標題
public abstract void makeString(String str); //產生檔案中的字串
public abstract void makeItems(String[] items); //產生檔案中的項目
public abstract Object getResult(); //取得完成檔案的方法
}
Director 類
public class Director {
private Builder builder;
/**
* 傳入Builder 的子類對象
* @param builder
*/
public Director(Builder builder) {
this.builder = builder;
}
/**
* 建立 檔案
* @return
*/
public Object construct(){
builder.makeTitle("terry");
builder.makeString("android developer");
builder.makeItems(new String[]{"Framework","java","native","HAL","Service"});
builder.makeString("windows phone 7 developer");
builder.makeItems(new String[]{"for silverlight","XNA"});
return builder.getResult();
}
}
該 類的建構函式的參數是 Builder 類型,但實際上並沒有任何Builder 類的對象執行個體被傳遞出去作為參數。因為Builder 類是抽象類別,根本無法產生對象執行個體。實際上傳給Director 的建構函式是Builder 的子類,根據所傳進來的類型決定產生檔案的格式。
因此如果想要達到產生檔案的目的,Builder 必須聲明一些必要而且面面俱到的方法群組。
TextBuilder 類
public class TextBuilder extends Builder{
private StringBuffer buffer=new StringBuffer();
@Override
public Object getResult() {
// TODO Auto-generated method stub
buffer.append("======================\n");
return buffer.toString();
}
@Override
public void makeItems(String[] items) {
// TODO Auto-generated method stub
for(String str:items)
{
buffer.append(str+"\n");
}
}
@Override
public void makeString(String str) {
// TODO Auto-generated method stub
buffer.append(str+"\n");
}
@Override
public void makeTitle(String title) {
// TODO Auto-generated method stub
buffer.append("=========================\n");
buffer.append(title+"\n");
}
}
HtmlBuilder 類
public class HtmlBuilder extends Builder{
private String fileName;
private StringBuffer writer=new StringBuffer();
@Override
public Object getResult() {
// TODO Auto-generated method stub
writer.append("</body></html>");
return writer.toString();
}
@Override
public void makeItems(String[] items) {
// TODO Auto-generated method stub
writer.append("<ul>");
for(String str:items){
writer.append("<li>"+str+"</li>");
}
writer.append("</ul>");
}
@Override
public void makeString(String str) {
// TODO Auto-generated method stub
writer.append("<p>"+str+"</p>");
}
@Override
public void makeTitle(String title) {
// TODO Auto-generated method stub
fileName=title+".html";
writer.append(fileName);
writer.append("<html><head><title>"+title+"</title></head><body>");
writer.append("<h1>"+title+"</h1>");
}
}
運行效果如下: