又稱生成器模式,屬於建立型模式。java
主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的建立工做,該對象一般包含多個子對象(成員屬性),並且子對象(成員屬性)的值都是通過必定的算法才獲得;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法卻相對穩定。算法
什麼時候使用:一些基本部件不會變,而其組合常常變化的時候。ui
意圖:將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。this
別慌,看到上面這句話可能很陌生,可是看完下面的例子,就會完全明白這句話的意思。spa
再來看下建造者模式的四個角色:抽象建造者builder、具體的建造者ConcereteBuilder、監工(指揮)Director、產品角色(最後被建立的實例)Productcode
產品角色Product:產品即是建造完畢後的複雜對象。對象
這個對象也包含成員變量,可是它的成員變量,多是java基本類型,也多是其餘複雜對象,還多是通過業務流程後的返回結果。接口
抽象建造者builder:定義了生成產品(實例)所須要的全部方法; get
能夠看作定義了一個接口,它定義了構建一個產品實例,須要哪些屬性。而且最後還要定義一個獲取(返回)產品實例的方法。產品
具體的建造者角色ConcereteBuilder:能夠看作是接口的實現類,通過重寫,實現了生成產品實例所須要的全部方法,而且定義獲取(返回)最終生成實例的方法。就是說,抽象建造者builder只是定義了產品實例的組成,和獲取方法,而具體的建造者角色ConcreteBuilder經過實現接口的方式重寫了產品實例的組成和獲取方法。說明能夠有多個具體的建造者角色ConcereteBuilder實現類,各自定義本身的生成產品實例所須要的方法。
監工角色Director:擔任這個角色的類是獨立的,它和複雜對象的構建過程沒有關係。
它的做用:
1.定義獲取產品實例的方法給使用者調用,保證產品實例是從監工類裏拿到的。
2.在獲取產品實例的方法中,執行抽象建造者builder定義的構建方法,但經過傳入外部參數,影響構建結果。由於抽象建造者builder接口能夠有不少個實現類。
四中角色起到的做用:
產品實例的構建方法定義在抽象建造者builder接口中
產品實例的構建過程,定義在建造者角色ConcereteBuilder接口的實現類中
想要得到產品實例,須要經過監工角色Director定義的方法
而在監工類定義的方法中,統一調用抽象建造者builder接口中定義的方法,可是由於具體的建造者角色ConcereteBuilder是接口的實現類,因此在構建產品實例的過程當中,傳入參數不一樣,好比傳入不一樣的具體的建造者角色ConcereteBuilder,不一樣的實現類,執行了各自的構建方法,返回的結果就不一樣。
這就達到了,將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。這個目的了。
注意:定義中「將一個複雜的構建過程與其表示相分離」,表示並非由建造者負責一切,而是由監工負責控制(定義)一個複雜的構建過程,由各個不一樣的建造者分別負責實現構建過程當中所用到的全部構建步驟。否則,就沒法作到「使得一樣的構建過程能夠建立不一樣的表示」這一目標。
1.產品角色Product
/** * 產品角色Product的實體類 * */ public class Human { private String head; private String body; private String hand; 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 getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
2.建立抽象建造者Builder
/** * 抽象建造者builder 一個接口,定義了Human屬性的構建方法,和返回Human實例的方法 */ public interface HumanBuilder { public void buildHead(String str); public void buildBody(String str); public void buildHand(String str); public void buildFoot(String str); public Human createHuman(); }
3.建立多個具體的建造者角色ConcereteBuilder
/** * 具體的建造者角色ConcreteBuilder 抽象建造者builder 接口的實現類 * 該具體的建造者,重寫了抽象建造者定義的全部方法,能夠表明某類具備本身個性的人類 * * 這裏表明,天賦自由的人 */ public class FreeHumanConcereBuilder implements HumanBuilder { Human human; public FreeHumanConcereBuilder() { human = new Human(); } public void buildHead(String str) { human.setHead(str); } public void buildBody(String str) { human.setBody(str); } public void buildHand(String str) { human.setHand(str); } public void buildFoot(String str) { human.setFoot(str); } public Human createHuman() { return human; } }
/** * 具體的建造者角色ConcreteBuilder 抽象建造者builder 接口的實現類 * 該具體的建造者,重寫了抽象建造者定義的全部方法,能夠表明某類具備本身個性的人類 * * 這裏表明,聰明的人 */ public class SmartHumanConcereBuilder implements HumanBuilder { Human human; public SmartHumanConcereBuilder() { human = new Human(); } public void buildHead(String str) { human.setHead("聰明"); } public void buildBody(String str) { human.setBody("通常"); } public void buildHand(String str) { human.setHand("通常"); } public void buildFoot(String str) { human.setFoot("通常"); } public Human createHuman() { return human; } }
.
/** * 具體的建造者角色ConcreteBuilder 抽象建造者builder 接口的實現類 * 該具體的建造者,重寫了抽象建造者定義的全部方法,能夠表明某類具備本身個性的人類 * * 這裏表明,強壯的人 */ public class StrongHumanConcereBuilder implements HumanBuilder { Human human; public StrongHumanConcereBuilder() { human = new Human(); } public void buildHead(String str) { human.setHead("通常"); } public void buildBody(String str) { human.setBody("強壯"); } public void buildHand(String str) { human.setHand("強壯"); } public void buildFoot(String str) { human.setFoot("強壯"); } public Human createHuman() { return human; } }
4.監工角色Director
/** * 監工角色Director 它不參與產品實例的構建過程,構建過程是由具體構建者實現的 它給使用者提供獲取產品實例的方法 * 經過調用抽象建造者定義的方法,返回構建結果 可是它能夠傳入自定義參數,返回不一樣的實現 */ public class Director { public Human getHuman(HumanBuilder bh, String head, String body, String hand, String foot) { bh.buildBody(body); bh.buildFoot(foot); bh.buildHand(hand); bh.buildHead(head); return bh.createHuman(); } }
5.建立請求者
public class Main { public static void main(String[] args) { Director director = new Director(); Human smartHuman = director.getHuman(new SmartHumanConcereBuilder(), "", "", "", ""); System.out.println("聰明的人:"); System.out.println(smartHuman.getHead()); System.out.println(smartHuman.getBody()); System.out.println(smartHuman.getHand()); System.out.println(smartHuman.getFoot()); Human strongHuman = director.getHuman(new StrongHumanConcereBuilder(), "", "", "", ""); System.out.println("強壯的人:"); System.out.println(strongHuman.getHead()); System.out.println(strongHuman.getBody()); System.out.println(strongHuman.getHand()); System.out.println(strongHuman.getFoot()); Human freeHuman = director.getHuman(new FreeHumanConcereBuilder(), "聰明", "強壯", "通常", "通常"); System.out.println("自由的人:"); System.out.println(freeHuman.getHead()); System.out.println(freeHuman.getBody()); System.out.println(freeHuman.getHand()); System.out.println(freeHuman.getFoot()); } }
6.輸出請求結果,咱們看到:將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。
聰明的人:聰明 通常 通常 通常 強壯的人:通常 強壯 強壯 強壯 自由的人:聰明 強壯 通常 通常