1、概述 ide
建造者模式很容易讓人想到建房子,無論建剛需房、改善房仍是別墅,它們都離不開地基、柱子、層面和牆體這些組成部分,建築工人就是把這些組成部分一個個建起來,最後連成一體建出一棟棟樓房。測試
來看看建造者模式的定義,將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。建房子的過程都是類似的,但能夠建出形形色色的房子。ui
2、結構類圖this
3、應用實例spa
咱們用製造自行車爲例子講解建造者模式,自行車由車架、輪胎、腳踏等部件組成,以下圖所示。自行車製造公司就是把這些零部件組裝起來。code
自行車製造公司的工程部門至關於指揮者,生產部門至關於建造者,當今共享單車作的比較大的摩拜和ofo至關於客戶,單車就是產品了。結構圖以下所示:對象
一塊兒來看看如何用代碼來實現blog
一、定義建立者接口,也就是生產線接口接口
package com.jet.pattern.builder; import com.jet.pattern.builder.impl.Bike; /** * description: * 自行車生產線接口 * Created by chenzanjin on 2017/2/22. */ public interface BikeBuilder { // 組裝輪胎 public void buildTyres(); // 組裝車架 public void buildFrame(); // 組裝GPS定位裝置 public void buildGPS(); // 獲取自行車 public Bike getBike(); }
二、定義摩拜單車生產線ip
package com.jet.pattern.builder.impl; import com.jet.pattern.builder.BikeBuilder; /** * description: * 摩拜單車生產線 * Created by chenzanjin on 2017/2/22. */ public class MoBikeBuilder implements BikeBuilder { // 擁有單車對象 Bike bike = new Bike(); @Override public void buildTyres() { bike.setTyre("橙色輪胎"); } @Override public void buildFrame() { bike.setFrame("橙色車架"); } @Override public void buildGPS() { bike.setGps("mobike定製版GPS定位裝置"); } @Override public Bike getBike() { return bike; } }
三、定義ofo單車生產線
package com.jet.pattern.builder.impl; import com.jet.pattern.builder.BikeBuilder; /** * description: * ofo單車生產線 * Created by chenzanjin on 2017/2/22. */ public class OfoBikeBuilder implements BikeBuilder { // 擁有單車對象 Bike bike = new Bike(); @Override public void buildTyres() { bike.setTyre("黑色輪胎"); } @Override public void buildFrame() { bike.setFrame("黃色車架"); } @Override public void buildGPS() { bike.setGps("ofo定製版GPS定位裝置"); } @Override public Bike getBike() { return bike; } }
四、定義單車對象
package com.jet.pattern.builder.impl; /** * description: * 自行車對象 * Created by chenzanjin on 2017/2/22. */ public class Bike { // 輪胎 private String tyre; // 車架 private String frame; // GPS定位裝置 private String gps; public String getTyre() { return tyre; } public void setTyre(String tyre) { this.tyre = tyre; } public String getFrame() { return frame; } public void setFrame(String frame) { this.frame = frame; } public String getGps() { return gps; } public void setGps(String gps) { this.gps = gps; } }
五、定義工程部
package com.jet.pattern.builder.impl; import com.jet.pattern.builder.BikeBuilder; /** * description: * 工程部門做爲指揮者,能夠指導生產部門做業 * Created by Administrator on 2017/2/22. */ public class EngineeringDepartment { // 用戶告知指揮者想要什麼樣的單車 BikeBuilder bikeBuilder; public EngineeringDepartment(BikeBuilder bikeBuilder){ this.bikeBuilder = bikeBuilder; } // 指導組裝單車 public void Construct(){ bikeBuilder.buildTyres(); bikeBuilder.buildFrame(); bikeBuilder.buildGPS(); } }
六、測試類
package com.jet.pattern.builder.impl; import com.jet.pattern.builder.BikeBuilder; /** * description: * 建造者測試類 * Created by Administrator on 2017/2/22. */ public class Test { public static void main(String[] args) { // 建造摩拜單車 BikeBuilder moBikeBuilder = new MoBikeBuilder(); EngineeringDepartment ed1 = new EngineeringDepartment(moBikeBuilder); ed1.Construct();// 指導組裝 // 產出單車,體現建造和顯示分離 Bike moBike = moBikeBuilder.getBike(); // 建造ofo單車 BikeBuilder ofoBikeBuilder = new MoBikeBuilder(); EngineeringDepartment ed2 = new EngineeringDepartment(ofoBikeBuilder); ed2.Construct();// 指導組裝 Bike ofoBike = ofoBikeBuilder.getBike(); } }
4、優缺點
一、優勢
(1)、產品的建造和表示分離,實現瞭解耦。
(2)、隱藏了產品的建造細節,用戶只需關心產品的表示,而不須要了解是如何建立產品的。
(3)、體現了開閉原則,如上代碼所示,若是須要再生產其餘共享單車,只須要再開一條生產線便可,不影響其餘生產線的做業。
二、缺點
(1)、當建造者過多時,會產生不少類,難以維護。
5、總結
建造者模式的使用場合是當建立複雜對象時,把建立對象成員和裝配方法分離出來,放在建造者類中去實現,用戶使用該複雜對象時,不用理會它的建立和裝配過程,只關心它的表示形式。其實徹底理解這個模式仍是要一番思考的,難以搞懂的是指揮者彷佛沒什麼存在的必要,在代碼裏也沒體現它的做用,咱們也能夠把指揮者的方法放在建造者裏面,但爲何沒有這樣作呢?我想這多是考慮到單一責任原則,建造者只負責建立對象的各個部分,至於各個部分建立的順序、裝配方法它就無論了。還有就是當順序要改變時,建造者能夠不用改動,改動指揮者就行了,指揮者只有一個,建造者有不少,要改建造者就麻煩了。