設計模式7-建造者模式
建造者模式:是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。
建造者模式通常包括下面幾個角色:
1、Builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。
2、ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。
3、Director:呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。
4、Product:要建立的複雜物件。
建造者應用場景
1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。
19元每週三 漢堡+可樂+薯條=套餐可能會發生改變。
2、JAVA 中的 StringBuilder 陣列(單個字元)字整合在一起 字串
使用場景:
1、需要生成的物件具有複雜的內部結構。
2、需要生成的物件內部屬性本身相互依賴。
與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
實際案例
這裡以遊戲開發中人物的構造過程為例。在遊戲中建立一個形象時,需要對每個部位進行建立。簡化而言,需要建立頭部,身體和四肢。
頭部、體部、四肢
程式碼實現
Person類
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 + "]"; } }
PersonBuilder類
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
// 組裝部件
Person buildPerson();
}
ZhangSanBuilder類
public class ZhangSanBuilder implements PersonBuilder {
private Person person;
public ZhangSanBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("zhangsan...head");
}
@Override
public void buildBody() {
person.setBody("zhangsan...body");
}
@Override
public void buildFoot() {
person.setFoot("zhangsan...foot");
}
public Person buildPerson() {
return person;
}
}
LisiBuilder類
public class LisiBuilder implements PersonBuilder {
private Person person;
public LisiBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("lisi...head");
}
@Override
public void buildBody() {
person.setHead("lisi...body");
}
@Override
public void buildFoot() {
person.setHead("lisi...foot");
}
@Override
public Person buildPerson() {
return person;
}
}
PersonDirector類
public class PersonDirector {
public Person createPerson(PersonBuilder personBuilder) {
personBuilder.buildHead();
personBuilder.buildBody();
personBuilder.buildFoot();
return personBuilder.buildPerson();
}
public static void main(String[] args) {
PersonDirector personDirector = new PersonDirector();
Person zhangSan = personDirector.createPerson(new ZhangSanBuilder());
System.out.println(zhangSan);
}
}
結果
Person [head=zhangsan...head, body=zhangsan...body, foot=zhangsan...foot]