摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計模式。為我們提供了建造者模式的快速實現(xiàn),要應(yīng)用到實際編碼中。
?本文收錄于專欄《源碼中的設(shè)計模式》——理論與實戰(zhàn)的完美結(jié)合
作者其它優(yōu)質(zhì)專欄推薦:
?《技術(shù)專家修煉》——搞技術(shù),進大廠,聊人生三合一專欄
?《leetcode 300題》——每天一道算法題,進大廠必備
?《糊涂算法》——從今天起,邁過數(shù)據(jù)結(jié)構(gòu)和算法這道坎
?《從實戰(zhàn)學(xué)python》——Python的爬蟲,自動化,AI等實戰(zhàn)應(yīng)用(代碼開源)
點擊跳轉(zhuǎn)到文末領(lǐng)取粉絲福利
哈嘍,大家好,我是一條~
之前的《白話設(shè)計模式》因為工作被擱置,如今再次啟航,并搭配框架源碼解析一起食用,將理論與實戰(zhàn)完美結(jié)合。
對設(shè)計模式不是很熟悉的同學(xué)可以先看一下《23種設(shè)計模式的一句話通俗解讀》全面的了解一下設(shè)計模式,形成一個整體的框架,再逐個擊破。
上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動力更足了。
今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計模式。
官方定義
將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
通俗解讀
提供一種創(chuàng)建對象的方式,創(chuàng)建的東西細節(jié)復(fù)雜,還必須暴露給使用者。屏蔽過程而不屏蔽細節(jié)。
類似建房子,只需要把材料和設(shè)計圖紙給工人,就能建成想要的房子,不關(guān)注工人建房子的過程,但對于細節(jié),我們又可以自己設(shè)計。
本文源碼:建造者模式 提取碼: vpqt
建議跟著一條學(xué)設(shè)計模式的小伙伴都建一個maven
工程,并安裝lombok
依賴和插件。
并建立如下包目錄,便于歸納整理。
pom
如下
<dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <version>1.16.10version> dependency>
現(xiàn)在有一個手機的建造者,我要讓它為我生產(chǎn)不用品牌和配置的手機。該怎么實現(xiàn)?
1.創(chuàng)建手機類
@Datapublic class Phone { //處理器 protected String cpu; //內(nèi)存 protected String mem; //磁盤 protected String disk; //屏幕大小 protected String size;}
2.創(chuàng)建建造者接口
//定義建造者的模板方法public interface Builder { Phone phone = new Phone(); void buildCpu(String cpu); void buildMem(String mem); void buildDisk(String disk); void buildSize(String size); default Phone getPhone(){ return phone; }}
3.創(chuàng)建Vivo
手機的建造者
public class VivoPhoneBuilder implements Builder{ //建造者細節(jié)的實現(xiàn) @Override public void buildCpu(String cpu) { phone.cpu=cpu; } @Override public void buildMem(String mem) { phone.mem=mem; } @Override public void buildDisk(String disk) { phone.disk=disk; } @Override public void buildSize(String size) { phone.size=size; }}
4.創(chuàng)建測試類
public class MainTest { public static void main(String[] args) { VivoPhoneBuilder builder = new VivoPhoneBuilder(); builder.buildCpu("888"); builder.buildDisk("512"); builder.buildMem("16"); builder.buildSize("plus"); Phone phone = builder.getPhone(); System.out.println(phone); }}
5.輸出結(jié)果
如果我這時需要生產(chǎn)OPPO
手機,只需新建一個OppoPhoneBuilder
實現(xiàn)Builder
接口即可。
相信大家在開發(fā)中都遇見過這樣的代碼,像鏈子一樣可以一直調(diào)用下去。
那么如何實現(xiàn)鏈?zhǔn)浇ㄔ煺?/strong>呢?
有以下兩種方式:
1.修改返回值為Builder
public interface Builder { Phone phone = new Phone(); // void 改為 Builder 同步修改實現(xiàn)類 Builder buildCpu(String cpu); Builder buildMem(String mem); Builder buildDisk(String disk); Builder buildSize(String size); default Phone getPhone(){ return phone; }}
測試1
public class MainTest { public static void main(String[] args) { // …… VivoPhoneBuilder builder2 = new VivoPhoneBuilder(); Phone phone1 = builder2 .buildCpu("888") .buildDisk("512") .buildMem("16") .buildSize("plus") .getPhone(); System.out.println("phone1:"+phone1); }}
結(jié)果1
2.使用lombok
@Data@Builder //使用鏈?zhǔn)浇ㄔ煺?/span>@NoArgsConstructor@AllArgsConstructorpublic class Phone { // ……}
測試2
public class MainTest { public static void main(String[] args) { // …… Phone build = Phone.builder() .cpu("888") .mem("16") .disk("512") .size("plus").build(); System.out.println("builder:"+build); }}
結(jié)果2
append();
給誰append呢? public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; }
Lombok-@Builder
建造者模式提供了對于同一構(gòu)建過程的不同表示,像流水線一樣生產(chǎn)對象。對于新增的對象,只需要創(chuàng)建對應(yīng)的建造者即可,不需要修改源代碼。
lombok
為我們提供了建造者模式的快速實現(xiàn)(@Builder
),要應(yīng)用到實際編碼中。
?Java:1.5G學(xué)習(xí)資料——回復(fù)「資料」
?算法:視頻書籍——回復(fù)「算法」
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121680.html
摘要:建造者實現(xiàn)抽象類的所有未實現(xiàn)的方法,具體來說一般是兩項任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類型 定義:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細節(jié)不需要知道 類型:創(chuàng)建型 實現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
摘要:書籍建造者類調(diào)用建造者高效能人士的七個習(xí)慣史蒂芬柯維勵志上面的這個類和第一個例子的效果一樣,但是長度確減少不少,在有更多屬性的時候,減少的代碼量會更為明顯。參考內(nèi)容設(shè)計模式張容銘 showImg(https://segmentfault.com/img/remote/1460000015147692); 1 什么是建造者模式? 建造者模式(Builder)是將一個復(fù)雜對象的構(gòu)建層與其表...
摘要:書籍建造者類調(diào)用建造者高效能人士的七個習(xí)慣史蒂芬柯維勵志上面的這個類和第一個例子的效果一樣,但是長度確減少不少,在有更多屬性的時候,減少的代碼量會更為明顯。參考內(nèi)容設(shè)計模式張容銘 showImg(https://segmentfault.com/img/remote/1460000015147692); 1 什么是建造者模式? 建造者模式(Builder)是將一個復(fù)雜對象的構(gòu)建層與其表...
摘要:在建造者模式比較龐大時,導(dǎo)演類可以有多個。該種場景只能是一個補償方法,因為一個對象不容易獲得,而在設(shè)計階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計的最初目標(biāo)。源碼地址參考文獻設(shè)計模式之禪 定義 Separate the construction of a complex object from its representation so that the same...
閱讀 2582·2021-09-30 09:48
閱讀 2573·2019-08-30 14:10
閱讀 2713·2019-08-29 11:22
閱讀 1842·2019-08-26 13:51
閱讀 2280·2019-08-26 12:02
閱讀 2421·2019-08-23 16:06
閱讀 3559·2019-08-23 14:06
閱讀 1096·2019-08-23 13:56