Java设计模式-建造者模式 理论代码相结合
繼工廠模式后的建造者模式,也是java中常常能夠見到的模式一種,應用場景也比較廣,比較好用。
大家想了解的話,一起來看一看啦。😁
很喜歡一句話:“八小時內謀生活,八小時外謀生存”
你好,如果喜歡,請一起堅持!!
望別日與君相見時,君已有所成。
共勉
先看看圖舒緩心情。😁 (我才不會告訴你我是一名喜歡藍天白云大海的小小博主😀 )
Java設計模式-建造者模式 理論代碼相結合
- 一、建造者模式
- 1)概念:
- 2)使用場景:
- 3)角色:
- 4)解釋:
- 二、代碼實例
- 2.1、題目
- 2.2、類圖
- 2.3、代碼
- 2.4、測試
- 三、總結
- 優點:
- 缺點:
- 四、擴展
- 五、工廠模式VS建造者模式
- 1、 工廠方法模式VS建造者模式
- 2、 抽象工廠模式VS建造者模式
- 五、自言自語
一、建造者模式
1)概念:
建造者模式是設計模式的一種,將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示.
舉幾個生活中的例子:
生活中這樣的例子很多,如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;每封電子郵件的發件人、收件人、主題、內容、附件等內容也各不相同。
還例如,計算機是由 CPU、主板、內存、硬盤、顯卡、機箱、顯示器、鍵盤、鼠標等部件組裝而成的,采購員不可能自己去組裝計算機,而是將計算機的配置要求告訴計算機銷售公司,計算機銷售公司安排技術人員去組裝計算機,然后再交給要買計算機的采購員。
在軟件開發過程中有時需要創建一個復雜的對象,這個復雜對象通常由多個子部件按一定的步驟組合而成。
2)使用場景:
3)角色:
建造者(Builder)模式包含如下角色:
- 抽象建造者類(Builder):這個接口規定要實現復雜對象的那些部分的創建,并不涉及具體的部件對象的創建。
- 具體建造者類(ConcreteBuilder):實現 Builder 接口,完成復雜產品的各個部件的具體創建方法。在構造過程完成后,提供產品的實例。
- 產品類(Product):要創建的復雜對象。
- 指揮者類(Director):調用具體建造者來創建復雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或按某種順序創建。
4)解釋:
- 分離了部件的構造(由Builder來負責)和裝配(由Director負責)。 從而可以構造出復雜的對象。適用于:某個對象的構建過程復雜的情況。
- 因為實現了構建和裝配的解耦,所以不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的復用。
- 建造者模式可以將部件和其組裝過程分開,一步一步創建一個復雜的對象。用戶只需要指定復雜對象的類型就可以得到該對象,而無須知道其內部的具體構造細節。
圖示:
二、代碼實例
2.1、題目
創建手機
生產手機是一個復雜的過程,它包含了手機芯片、后殼、屏幕等組件。手機芯片又有多種高通、ios等,后殼也有多種玻璃、陶瓷等,屏幕也是一樣的。
這里Phone是產品,包含芯片、后殼、屏幕等組件;Builder是抽象建造者,IphoneBuilder和HuaweiBuilder是具體的建造者;Director是指揮者。
2.2、類圖
2.3、代碼
1、Phone (具體產品類)
@Data public class Phone {/**手機芯片*/private String chip;/** 后殼*/private String backCover;/**屏幕*/private String screen; }2、Builder (抽象建造者類)
public abstract class Builder {protected Phone phone = new Phone();public abstract void buildchip();public abstract void buildbackCover();public abstract void buildscreen();public abstract Phone getPhone();}3、HuaweiBuilder、IphoneBuilder (具體建造者類)
public class HuaweiBuilder extends Builder{@Overridepublic void buildchip() { phone.setChip("華為自言芯片麒麟9000"); }@Overridepublic void buildbackCover() { phone.setBackCover("玻璃后殼"); }@Overridepublic void buildscreen() { phone.setScreen("國產屏幕"); }@Overridepublic Phone getPhone() { return phone; } } public class IphoneBuilder extends Builder {@Overridepublic void buildchip() { phone.setChip("蘋果自研ios芯片"); }@Overridepublic void buildbackCover() { phone.setBackCover("玻璃后殼"); }@Overridepublic void buildscreen() { phone.setScreen("iphone屏幕"); }@Overridepublic Phone getPhone() { return phone; } }4、Director (指揮者類)
public class Director {private Builder builder;public Director(Builder builder) { this.builder = builder; }public Phone construct() {builder.buildchip();builder.buildbackCover();builder.buildscreen();return builder.getPhone();} }上面示例是 Builder模式的常規用法,根據系統設計情況的不同,設計模式在一些細節地方會作出一些更改,當然這是為了更好的利用設計模式的優勢。(具體問題具體分析使用,這是不可避免的)😁
2.4、測試
代碼就是上面這些,不多。
public class Client {public static void main(String[] args) {// Director director = new Director(new IphoneBuilder());// 想要換Huawei啦 只需要換成HuaweiBuilder 即可,而不需要修改其他代碼Director director = new Director(new HuaweiBuilder());Phone phone = director.construct();System.out.println(phone);} }三、總結
優點:
1)建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在指揮者類中對整體而言可以取得比較好的穩定性。
2)客戶端(使用程序)不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象
3)可以更加精細地控制產品的創建過程。將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,也更方便使用程序來控制創建過程
4)增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統擴展方便,符合“開閉原則”
缺點:
四、擴展
建造者模式除了上面的用途外,在開發中還有一個常用的使用方式,就是當一個類構造器需要傳入很多參數時,如果創建這個類的實例,代碼可讀性會非常差,而且很容易引入錯誤,此時就可以利用建造者模式進行重構。
這個是非常常見的。
代碼重構前:
@Data @AllArgsConstructor @NoArgsConstructor public class Phone {private String cpu;private String screen;private String memory;private String mainboard; }public class Client {public static void main(String[] args) {//構建Phone對象Phone phone = new Phone("intel","三星屏幕","金士頓","華碩");System.out.println(phone);} }new 對象是需要傳遞了四個參數,如果參數更多呢?代碼的可讀性及使用的成本就是比較高。
代碼重構后:
public class Phone {private String cpu;private String screen;private String memory;private String mainboard;private Phone(Builder builder) {cpu = builder.cpu;screen = builder.screen;memory = builder.memory;mainboard = builder.mainboard;}public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder() {}public Builder cpu(String val) {cpu = val;return this;}public Builder screen(String val) {screen = val;return this;}public Builder memory(String val) {memory = val;return this;}public Builder mainboard(String val) {mainboard = val;return this;}public Phone build() {return new Phone(this);}}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", screen='" + screen + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +'}';} }public class Client {public static void main(String[] args) {Phone phone = new Phone.Builder().cpu("intel").mainboard("華碩").memory("金士頓").screen("三星").build();System.out.println(phone);} }重構后的這種代碼,大家也是經常能夠看到的方式,不過這里只是一個小小demo,只是為了演示,不足之處眾多,請見諒。
五、工廠模式VS建造者模式
Java設計模式-工廠方法模式
1、 工廠方法模式VS建造者模式
-
工廠方法模式注重的是整體對象的創建方式;
-
建造者模式注重的是部件構建的過程,意在通過一步一步地精確構造創建出一個復雜的對象。
舉個簡單例子:
1、如要制造一個超人,如果使用工廠方法模式,直接產生出來的就是一個力大無窮、能夠飛翔、內褲外穿的超人;
2、而如果使用建造者模式,則需要組裝手、頭、腳、軀干等部分,然后再把內褲外穿,于是一個超人就誕生了。
2、 抽象工廠模式VS建造者模式
-
抽象工廠模式實現對產品家族的創建,一個產品家族是這樣的一系列產品:具有不同分類維度的產品組合,采用抽象工廠模式則是不需要關心構建過程,只關心什么產品由什么工廠生產即可。
-
建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。
如果將抽象工廠模式看成汽車配件生產工廠,生產一個產品族的產品,那么建造者模式就是一個汽車組裝工廠,通過對部件的組裝可以返回一輛完整的汽車。
五、自言自語
你卷我卷,大家卷,什么時候這條路才是個頭啊。😇(還是直接上天吧)
有時候也想停下來歇一歇,一直做一個事情,感覺挺難堅持的。😁
你好,如果你正巧看到這篇文章,并且覺得對你有益的話,就給個贊吧,讓我感受一下分享的喜悅吧,蟹蟹。🤗
如若有寫的有誤的地方,也請大家不嗇賜教!!
同樣如若有存在疑惑的地方,請留言或私信,定會在第一時間回復你。
持續更新中
總結
以上是生活随笔為你收集整理的Java设计模式-建造者模式 理论代码相结合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过简单例子 | 快速理清 UML类图中
- 下一篇: Java | 设计模式-适配器模式