淺談Java設計模式——建造者模式(Builder)
一、概述
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
建造者模式將複雜產品的構建過程封裝分解在不同的方法中,使得建立過程非常清晰,能夠讓我們更加精確的控制複雜產品物件的建立過程,同時它隔離了複雜產品物件的建立和使用,使得相同的建立過程能夠建立不同的產品。但是如果某個產品的內部結構過於複雜,將會導致整個系統變得非常龐大,不利於控制,同時若幾個產品之間存在較大的差異,則不適用建造者模式,畢竟這個世界上存在相同點大的兩個產品並不是很多,所以它的使用範圍有限
二、使用場景
1.當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。
2.當構造過程必須允許被構造的物件有不同的表示時。
3.適用於那些產品物件的內部結構比較複雜。
三、參與者
1.Product 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程。 包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。
2.Builder 抽象建造者,為建立一個Product物件的各個部件指定抽象介面。
3.ConcreteBuilder 實現Builder的介面以構造和裝配該產品的各個部件。 定義並明確它所建立的表示。 提供一個檢索產品的介面。
4.Director 指揮者類,構造一個使用Builder介面的物件。
四、類圖
五、程式碼示例
1.Product 表示被構造的複雜物件。
public class Person { 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; } @Override public String toString() { return "Person{" + "head='" + head + '\'' + ", body='" + body + '\'' + ", foot='" + foot + '\'' + '}'; } }
2.Builder 抽象建造者。
/**
* 物件構造介面,約束行為
* @author zhipeng_Tong
*/
public interface PersonBuilder {
void buildHead(); // 構建頭
void buildBody(); // 構建身體
void buildFoot(); // 腳
Person getPerson(); // 獲取
}
3.ConcreteBuilder 實現Builder的介面以構造和裝配該產品的各個部件。
public class PersonThinBuilder implements PersonBuilder {
private Person person;
public PersonThinBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("頭部");
}
@Override
public void buildBody() {
person.setBody("瘦瘦的身體");
}
@Override
public void buildFoot() {
person.setFoot("腳");
}
@Override
public Person getPerson() {
return person;
}
}
public class PersonFatBuilder implements PersonBuilder {
private Person person;
public PersonFatBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("頭部");
}
@Override
public void buildBody() {
person.setBody("胖胖的身體");
}
@Override
public void buildFoot() {
person.setFoot("腳部");
}
@Override
public Person getPerson() {
return person;
}
}
4.Director 指揮者類。
public class PersonDirector {
public Person constructPerson(PersonBuilder builder) {
builder.buildHead();
builder.buildBody();
builder.buildFoot();
Person person = builder.getPerson();
return person;
}
}
測試程式碼:
public class Client {
public static void main(String[] args) {
PersonDirector director = new PersonDirector();
PersonThinBuilder ptb = new PersonThinBuilder();
Person person = director.constructPerson(ptb);
System.out.println(person);
PersonFatBuilder pfb = new PersonFatBuilder();
Person person1 = director.constructPerson(pfb);
System.out.println(person1);
}
}
Person{head='頭部', body='瘦瘦的身體', foot='腳'} Person{head='頭部', body='胖胖的身體', foot='腳部'}