定義 : 將一個複雜的對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示.也就是說用戶不須要知道一個複雜的對象時如何建立的.用戶只須要知道使用構造不一樣對象的方法(Director)就能獲得一個完整的複雜對象的實例java
建造者模式一般包含的幾個角色算法
Builder : 給出的一個抽象接口,規範產品對象的各個組成部分的建造.這個接口先聲明必需要實現的複雜對象的各個方法.留待他的實現類進行不一樣的實現.ide
ConcreteBuilder : Builder的實現類,用以構造和裝配該產品的各個部件.定義該產品的表示.學習
Director : 構造的一個使用builder接口的對象,用以建立各個不一樣表示的實例類.測試
做用一 : 隔離客戶與對象的生產過程.ui
做用二 : 負責控制產品對象的生產過程.this
Product : 被構造的複雜對象.ConcreteBuilder建立該產品的內部表示並定義她的裝配過程.spa
適用性:設計
當建立複雜對象的算法應該獨立於該對象的組成部分以及他們的裝配方式時.code
當構造過程必須容許被構造的對象有不一樣的表示時.
優勢 :
將複雜對象的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,可以幫助咱們更加精確的控制複雜對象的產生過程.
將產品的建立過程與產品自己分離開來,可使用相同的建立過程來獲得不一樣的產品.也就說細節依賴抽象.
每個具體建造者都相互獨立,而與其它的具體建造者無關,所以能夠很方便的替換具體建造者或增長新的具體建造者.用戶可使用不一樣的具體建造者便可獲得不一樣的產品對象.
缺點 :
建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其適用範圍會受到必定的限制.
若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化.會致使系統變得很龐大.
在抽象工廠樣式中,每一次工廠對象被呼叫時都會傳回一個完整的產品對象,而使用端有可能會決定把這些產品組裝成一個更大的和複雜的產品,也有可能不會。工廠對象是沒有狀態的,不知道上一次構建的是哪個產品,也沒有將來的概念,不知道下一次構建的是哪個產品,更不知道本身構建的產品在更高層的產品結構藍圖中是什麼位置。
建造類別則不一樣,建造樣式的重點在導演者角色。導演者對象是有狀態的,它知道總體藍圖,知道上一次、這一次和下一次交給建造者角色去構建的零件是什麼,以便可以將這些零件組裝成爲一個更大規模的產品。它一點一點地建造出一個複雜的產品,而這個產品的組裝程序就發生在導演者角色內部。建造者樣式的使用端拿到的是一個完整的最後產品。
換言之,雖然抽象工廠樣式與建造樣式都是設計樣式,可是抽象工廠樣式處在更加具體的尺度上,而建造樣式則處於更加宏觀的尺度上。一個系統能夠由一個建造樣式和一個抽象工廠樣式組成,使用端經過呼叫這個導演角色,間接地呼叫另外一個抽象工廠樣式的工廠角色。工廠樣式傳回不一樣產品族的零件,而建造者樣式則把它們組裝起來。
好比仍以衆神造人爲例,女媧利用建造樣式負責把靈魂、耳目、手臂等組合成一個完整的人,而黃帝、上駢、桑林各自利用工廠樣式創造出靈魂、耳目、臂手等。女媧沒必要考慮靈魂、耳目、手臂是什麼樣子、怎麼創造出來的,這就成爲一個由建造樣式和抽象工廠樣式組合而成的系統。
例子 : 每個活過75歲的人都必定會有下面的幾個階段:嬰兒, 少年, 青年, 中年, 老年.而且每個人的各個階段的經歷都會是不同的.
Builder (經歷抽象接口)
package Builder; /** * */ public interface LiveBuilder { public void buildBaby(); public void buildChildren(); public void buildYouth(); public void buildMidLife(); public void buildOld(); public PersonLive getPerson(); }
ConcreteBuilder (仲永型天才兒童經歷實現)
package Builder; /** * Created by vegetate */ public class GiftedChildrenBuilder implements LiveBuilder { private PersonLive personLive; public GiftedChildrenBuilder(){ personLive = new PersonLive(); } @Override public void buildBaby() { personLive.setBaby("不同凡響"); } @Override public void buildChildren() { personLive.setChildren("脫穎而出"); } @Override public void buildYouth() { personLive.setYouth("隨父炫耀"); } @Override public void buildMidLife() { personLive.setMidLife("泯然衆人矣"); } @Override public void buildOld() { personLive.setOld("泯然衆人矣"); } @Override public PersonLive getPerson() { return personLive; } }
ConcreteBuilder(姜子牙型老有所成實現)
package Builder; /** * */ public class OldSuccessBuilder implements LiveBuilder { private PersonLive personLive; public OldSuccessBuilder(){ personLive = new PersonLive(); } @Override public void buildBaby() { personLive.setBaby("正常嬰兒"); } @Override public void buildChildren() { personLive.setChildren("學習"); } @Override public void buildYouth() { personLive.setYouth("學習"); } @Override public void buildMidLife() { personLive.setMidLife("學習"); } @Override public void buildOld() { personLive.setOld("老有所成"); } @Override public PersonLive getPerson() { return personLive; } }
Director類
package Builder; /** * */ public class LiveDirector { public PersonLive generateLive(LiveBuilder liveBuilder){ liveBuilder.buildBaby(); liveBuilder.buildChildren(); liveBuilder.buildYouth(); liveBuilder.buildMidLife(); liveBuilder.buildOld(); return liveBuilder.getPerson(); } }
Product(人的經歷類)
package Builder; /** * */ public class PersonLive { private String baby; private String children; private String youth; private String midLife; private String old; public String getBaby() { return baby; } public void setBaby(String baby) { this.baby = baby; } public String getChildren() { return children; } public void setChildren(String children) { this.children = children; } public String getYouth() { return youth; } public void setYouth(String youth) { this.youth = youth; } public String getMidLife() { return midLife; } public void setMidLife(String midLife) { this.midLife = midLife; } public String getOld() { return old; } public void setOld(String old) { this.old = old; } }
測試類
package Builder; /** * */ public class BuilderTest { public static void main(String[] args) { LiveDirector liveDirector = new LiveDirector(); //仲永 PersonLive zhongyong = liveDirector.generateLive(new GiftedChildrenBuilder()); //姜子牙 PersonLive jiangziya = liveDirector.generateLive(new OldSuccessBuilder()); } }