什麼是建造者模式
- 概念
建造者模式就是将一個複雜的對象的建立和表示分離,使得同樣建構過程可以建立不同的表示!
- 角色
在這樣的設計模式中,有以下幾個角色:
1、Builder:為建立一個産品對象的各個部件指定抽象接口。
2、ConcreteBuilder:實作Builder的接口以構造和裝配該産品的各個部件,定義并明确它所建立的表示,并提供一個檢索産品的接口。
3、Director:構造一個使用Builder接口的對象,指導建構過程。
4、Product:表示被構造的複雜對象。ConcreteBuilder建立該産品的内部表示并定義它的裝配過程,包含定義組成部件的類,包括将這些部件裝配成最終産品的接口。
舉例
首先建立一個人類
//角色Product:
public class Preson {
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
然後寫一個接口。一個定義了造人标準的接口
//角色Builder:
public interface PersonBuild {
public void buildHead();
public void buildBody();
public void buildFoot();
public Preson buildPreson();
}
有各種造部位的方法,最後給個createHuman方法給你傳回一個我們想要造的人。
人的類和造人的标準我們都定義好了。接下來造一個男人。
//角色ConcreteBuilder:
public class ManBuilder implements PersonBuild {
private Preson preson;
public ManBuilder() {
this.preson = new Preson();
}
public void buildHead() {
preson.setHead("男人的身體");
System.out.println("建造男人的身體");
}
public void buildBody() {
preson.setBody("男人的頭");
System.out.println("建造男人的頭");
}
public void buildFoot() {
preson.setHead("男人的腳");
System.out.println("建造男人的腳");
}
public Preson buildPreson() {
return preson;
}
}
繼承制造的标準接口,然後就是set方法封裝人的部件,最後傳回造好的人。
到這裡我們的人并沒建好,就比如我們制造好了機器的生産步驟但是并沒有啟動它,接下來就是建造過程director,他負責執行剛才的造人動作,代碼如下:
//角色Director:
public class PersonDirector {
protected Preson constructPerson(PersonBuild personBuild){
personBuild.buildBody();
personBuild.buildFoot();
personBuild.buildHead();
Preson preson = personBuild.buildPreson();
return preson;
}
}
這個PersonDirector類,重點在于constructPerson的參數是我們的造人标準的接口。這樣一來,隻要是實作了我們的這個接口的類,就都可以作為參數,我們剛剛不是造了一個男人嗎?那我們如果想造一個女人,這個director也可以啟動這個造人過程,隻要我們把這個女人的ConcreteBuilde先寫好。
測試代碼如下:
public class ProsonText {
public static void main(String[] args) {
PersonDirector personDirector = new PersonDirector();
personDirector.constructPerson(new ManBuilder());
}
}
輸出:
建造男人的頭
建造男人的腳
建造男人的身體
總結
建造者模式在使用過程中可以演化出多種形式:
如果具體的被建造對象隻有一個的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product裡面實作。
建造者模式将很多功能內建到一個類裡,這個類可以創造出比較複雜的東西。是以與工程模式的差別就是:工廠模式關注的是建立單個産品,而建造者模式則關注建立符合對象,多個部分。是以,是選擇工廠模式還是建造者模式,依實際情況而定。