//此總結爲個人原創,有任何問題歡迎指出並改正,謝謝支持
簡介
作用:
1.將一個複雜對象的構建過程與它的表示分離,從而使得相同的構建過程可以創建不同的表示;
2.創建者模式隱藏了複雜對象的創建過程,它把複雜對象的構建加以抽象,通過子類繼承或者重載的方式,動態的創建具有複合屬性的對象。
應用場景
動態創建複雜的對象
四個要素
①建造者(Builder)
對複雜對象定義抽象接口;該接口規定了要實現複雜對象的各個部分的構建,不涉及具體對象的具體的構建。
②具體創建者(ConcreteBuilder)
1.實現Builder接口,針對不同的業務邏輯,具體化複雜對象的各個部分的創建;
2.在建造過程完成後,提供產品的實例
③指導者(Director)
調用具體建造者來創建複雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或者按某種順序創建。
④產品(Product)
要創建的複雜的對象,一般來說包含多個部分或屬性。
實例
Product
public class Person { private String body; private String head; private String foot; public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
Builder
public interface Builder { void builderHead(String head); void builderBody(String body); void builderFoot(String foot); Person builderPerson(); }
ConcreteBuilder
public class ManBuilder implements Builder { private Person person = null; public ManBuilder() { person = new Person(); } @Override public void builderHead(String head) { person.setHead(head); } @Override public void builderBody(String body) { person.setBody(body); } @Override public void builderFoot(String foot) { person.setFoot(foot); } @Override public Person builderPerson() { return person; } }
Director
public class PersonDirector { public Person creatPerson(Builder manBuilder){ manBuilder.builderFoot("foot"); manBuilder.builderBody("body"); manBuilder.builderHead("head"); return manBuilder.builderPerson(); } }
調用
PersonDirector pd = new PersonDirector(); Person person = pd.creatPerson(new ManBuilder());
實例2
public class NewMan { private String body; private String head; private String foot; public NewMan(String body, String head, String foot) { this.body = body; this.head = head; this.foot = foot; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } public static Builder getBuilder(){ return new Builder(); } public static class Builder{ private String body; private String head; private String foot; public Builder builderHead(String h){ head = h; return this; } public Builder builderBody(String b){ body = b; return this; } public Builder builderFoot(String f){ foot = f; return this; } public NewMan build(){ return new NewMan(body,head,foot); } } }
調用
NewMan newMan = NewMan.getBuilder().builderBody("body").builderFoot("foot").builderHead("head").build();
建造者模式的優點
首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在導演類中對整體而言可以取得比較好的穩定性。
其次,建造者模式很容易進行擴展。如果有新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,因此也就不會對原有功能引入風險