摘要:本質(zhì)建造者設(shè)計(jì)模式分離了對(duì)象子組件的構(gòu)造過(guò)程和組裝過(guò)程,實(shí)現(xiàn)了構(gòu)建與組裝的解耦,不同的構(gòu)建器相同的組裝順序以及相同的構(gòu)建器不同的組裝順序都可以創(chuàng)建出不同的對(duì)象,使得構(gòu)建與組裝充分解耦,進(jìn)而實(shí)現(xiàn)構(gòu)建算法與組裝算法的解耦,從而實(shí)現(xiàn)更好的復(fù)用。
這是設(shè)計(jì)模式系列的第二篇——建造者設(shè)計(jì)模式,我希望推送的文章是一個(gè)系列的,盡量保持一樣的寫(xiě)作風(fēng)格,盡量把我理解的闡述清楚,關(guān)于建造者設(shè)計(jì)模式主要從以下幾個(gè)方面來(lái)學(xué)習(xí),具體如下:
概述
本質(zhì)
關(guān)鍵概念
具體實(shí)現(xiàn)
總結(jié)
概述建造者設(shè)計(jì)模式(Builder Pattern)屬于創(chuàng)建型設(shè)計(jì)模式,主要用于創(chuàng)建復(fù)雜的對(duì)象,可將復(fù)雜對(duì)象的構(gòu)建過(guò)程抽象出來(lái),通過(guò)不同實(shí)現(xiàn)的構(gòu)建者和裝配者最終組裝出不同的對(duì)象,可以非常方便的增加不同實(shí)現(xiàn)的構(gòu)建者、組裝者而不用修改以前的代碼。
本質(zhì)建造者設(shè)計(jì)模式(Builder Pattern)分離了對(duì)象子組件的構(gòu)造過(guò)程和組裝過(guò)程,實(shí)現(xiàn)了構(gòu)建與組裝的解耦,不同的構(gòu)建器相同的組裝順序以及相同的構(gòu)建器不同的組裝順序都可以創(chuàng)建出不同的對(duì)象,使得構(gòu)建與組裝充分解耦,進(jìn)而實(shí)現(xiàn)構(gòu)建算法與組裝算法的解耦,從而實(shí)現(xiàn)更好的復(fù)用。
關(guān)鍵概念構(gòu)建者(Builder):構(gòu)建不同的子組件且返回子組件或者提供獲取復(fù)雜對(duì)象的方法,將構(gòu)建過(guò)程抽象成接口或抽象類,方便擴(kuò)展具體的不同的構(gòu)建者。
組裝者(Dirctor):通過(guò)某個(gè)具體的構(gòu)建者構(gòu)建相關(guān)的子組件,同時(shí)對(duì)外提供組成復(fù)雜產(chǎn)品對(duì)象的方法。
當(dāng)需要生成復(fù)雜對(duì)象時(shí),直接通過(guò)某個(gè)具體的組裝者獲得想要的具體對(duì)象即可,至于組裝過(guò)程與構(gòu)建過(guò)程使用者不需要關(guān)心,分別由具體的組裝者與具體的構(gòu)建者內(nèi)部完成。當(dāng)然復(fù)雜對(duì)象可以理解為具有很多屬性的對(duì)象。
具體實(shí)現(xiàn)下面以手機(jī)的組裝過(guò)程來(lái)說(shuō)明建造者設(shè)計(jì)模式的具體實(shí)現(xiàn),產(chǎn)品類如下:
/** * 產(chǎn)品 * @author jzman */ public class Phone { private Screen screen; private Camera camera; private Cpu cpu; //省略getter、setter、toString 方法 //... } //子組件 class Screen{ private String name; //... } //子組件 class Camera{ private String name; //... } //子組件 class Cpu{ private String name; //... }
抽象的構(gòu)建者:
/** * 構(gòu)建者 * @author jzman */ public interface PhoneBuilder { Screen builderScreen(); Camera builderCamera(); Cpu builderCpu(); }
具體的構(gòu)建者:
/** * 具體的構(gòu)建者 * @author jzman */ public class MiPhoneBuilder implements PhoneBuilder{ @Override public Screen builderScreen() { System.out.println("構(gòu)建屏幕..."); return new Screen("Mi-screen"); } @Override public Camera builderCamera() { System.out.println("構(gòu)建相機(jī)..."); return new Camera("Mi-camera"); } @Override public Cpu builderCpu() { System.out.println("構(gòu)建屏幕..."); return new Cpu("Mi-cpu"); } }
抽象的組裝者:
/** * 抽象的組裝者 * @author jzman */ public interface PhoneDirector { Phone directPhone(); }
具體的構(gòu)建者:
/** * 具體的組裝者 * @author jzman */ public class MiPhoneDirector implements PhoneDirector{ private PhoneBuilder builder; public MiPhoneDirector(PhoneBuilder builder) { this.builder = builder; } @Override public Phone directPhone() { Phone phone = new Phone(); phone.setScreen(builder.builderScreen()); phone.setCamera(builder.builderCamera()); phone.setCpu(builder.builderCpu()); return phone; } }
使用者直接通過(guò)某個(gè)具體的組裝者獲取最終的產(chǎn)品,具體如下:
public class Client { public static void main(String[] args) { PhoneBuilder builder = new MiPhoneBuilder(); MiPhoneDirector director = new MiPhoneDirector(builder); Phone phone = director.directPhone(); System.out.println(phone); } }
執(zhí)行結(jié)果如下:
構(gòu)建屏幕... 構(gòu)建相機(jī)... 構(gòu)建屏幕... Phone [screen=Screen [name=Mi-screen], camera=Camera [name=Mi-camera], cpu=Cpu [name=Mi-cpu]]
最終,使用者通過(guò)具體的組裝者 MiPhoneDirector 組裝出一個(gè)具有明顯組裝特征的手機(jī),即一個(gè)屏幕是 Mi-screen 、相機(jī)是 Mi-camera、CPU 是 Mi-cpu 的手機(jī)。
總結(jié)建造者設(shè)計(jì)模式(Builder Pattern) 一般用于具有共同特性的復(fù)雜對(duì)象,其對(duì)象本身與構(gòu)建、組裝過(guò)程分離,可做到復(fù)雜對(duì)象屬性的可配置,當(dāng)然,如果復(fù)雜對(duì)象內(nèi)部過(guò)于復(fù)雜,勢(shì)必會(huì)需要?jiǎng)?chuàng)建更多的構(gòu)建者類,使得構(gòu)建過(guò)程繁瑣,我覺(jué)得開(kāi)發(fā)中使用建造者設(shè)計(jì)模式主要用來(lái)做一些封裝,使得代碼寫(xiě)起來(lái)更靈活,如 Picasso、Glide 的 API 就有建造者設(shè)計(jì)模式的使用,使得復(fù)雜對(duì)象的一些屬性可以做到可配置,非常方便。
可以選擇關(guān)注微信公眾號(hào):jzman-blog 獲取最新更新,一起交流學(xué)習(xí)!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74730.html
摘要:參考文章設(shè)計(jì)模式之建造者模式一什么是建造者模式建造者模式是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 參考文章:java設(shè)計(jì)模式之建造者模式 一、什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。工廠類模式提供的是創(chuàng)建單個(gè)類的模式,而建造者模式則是將各種產(chǎn)品集中起來(lái)進(jìn)行管理,用來(lái)創(chuàng)建復(fù)合對(duì)象,所謂...
摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類創(chuàng)建具體建造者類。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 說(shuō)人話:將構(gòu)...
摘要:建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來(lái)說(shuō)一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類型 定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過(guò)程及細(xì)節(jié)不需要知道 類型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
閱讀 1413·2023-04-26 03:04
閱讀 2365·2019-08-30 15:44
閱讀 3736·2019-08-30 14:15
閱讀 3541·2019-08-27 10:56
閱讀 2759·2019-08-26 13:53
閱讀 2627·2019-08-26 13:26
閱讀 3089·2019-08-26 12:11
閱讀 3618·2019-08-23 18:21