builder设计模式

考慮今天您要建立一個車庫,您已經構想好一個基本的車庫藍圖,這個車庫的功能很簡單,有一個屋頂、四面牆,其中一面牆設有一個車子進出的門,因為預算的關係,這個車庫要用哪些材質來建立您還沒有決定,您找了兩個建車庫的人,其中一個可以幫您建立一個實用的車庫,但索價較高,另一個的索價較低,但所用的材質都是木頭而已。

無論如何您最終的選擇是什麼,建車庫的人只要按照您的藍圖來建車庫,功能上都是可以達到您的要求的,您這時所扮演的是指導者(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的原因。

Site powered by a free Open Source Project / Non-profit License ( more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
 
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.4 Build:#410 Feb 15, 2006) - Bug/feature request - Contact Administrators
<script language="JavaScript" type="text/javascript">var domainName = 'http://www.javaworld.com.tw/confluence'; var entityId = '1226'; var spaceKey = 'designpattern'</script><script language="JavaScript" src="/confluence/labels-javascript" type="text/javascript"></script><script type="text/javascript">new Ajax.Autocompleter('labelName', 'labelsAutocompleteList', '1226', { tokens: new Array(',', ' '), dwrFunction: GenerateAutocompleteLabelsListForEntity.autocompleteLabels});</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值