java實(shí)現(xiàn)建造者模式(Builder Pattern)
一、什么是建筑者模式?
建造者模式(Builder Pattern)使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建一個(gè)復(fù)雜的對(duì)象。
一個(gè) Builder 類(lèi)會(huì)一步一步構(gòu)造最終的對(duì)象,該 Builder 類(lèi)獨(dú)立于其他對(duì)象。
建造者模式主要解決在軟件系統(tǒng)中,有時(shí)候面臨著"一個(gè)復(fù)雜對(duì)象"的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。
二、建造者模式的具體實(shí)現(xiàn)
結(jié)構(gòu)圖
建造者模式中的四個(gè)角色:
1、Builder:給出一個(gè)抽象接口,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。這個(gè)接口規(guī)定要實(shí)現(xiàn)復(fù)雜對(duì)象的哪些部分的創(chuàng)建,并不涉及具體的對(duì)象部件的創(chuàng)建。
2、ConcreteBuilder:實(shí)現(xiàn)Builder接口,針對(duì)不同的商業(yè)邏輯,具體化復(fù)雜對(duì)象的各部分的創(chuàng)建。 在建造過(guò)程完成后,提供產(chǎn)品的實(shí)例。
3、Director:調(diào)用具體建造者來(lái)創(chuàng)建復(fù)雜對(duì)象的各個(gè)部分,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保證對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
4、Product:要?jiǎng)?chuàng)建的復(fù)雜對(duì)象。
java代碼實(shí)現(xiàn)
1、創(chuàng)建人類(lèi)實(shí)體類(lèi)
package com.designpattern.builderPattern; /** * 對(duì)象 人 * * @author zhongtao on 2018/9/17 */ public class Human { private String head; private String body; private String hand; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
2、創(chuàng)建造人的 Builder 接口
package com.designpattern.builderPattern; /** * 造人接口 規(guī)定造人的規(guī)范 需要頭、身體、手、腳 * * @author zhongtao on 2018/9/17 */ public interface BuilderHuman { void buildHead(); void buildBody(); void buildHand(); void buildFoot(); /** * 返回創(chuàng)建的對(duì)象 */ Human createHuman(); }
3、ConcreteBuilder 創(chuàng)建不同類(lèi)型的人
tallPerson
package com.designpattern.builderPattern; /** * 高個(gè)子的人 * * @author zhongtao on 2018/9/17 */ public class TallPersonBuilder implements BuilderHuman { Human human; public TallPersonBuilder() { human = new Human(); } @Override public void buildHead() { human.setHead("普通的頭腦"); } @Override public void buildBody() { human.setBody("壯實(shí),高大的身體"); } @Override public void buildHand() { human.setHand("長(zhǎng)手"); } @Override public void buildFoot() { human.setFoot("長(zhǎng)腳"); } @Override public Human createHuman() { return human; } }
smartHuman
package com.designpattern.builderPattern; /** * 聰明的人 * * @author zhongtao on 2018/9/17 */ public class SmartHumanBuilder implements BuilderHuman { Human human; public SmartHumanBuilder() { human = new Human(); } @Override public void buildHead() { human.setHead("高智商的頭腦"); } @Override public void buildBody() { human.setBody("健康的身體"); } @Override public void buildHand() { human.setHand("普通的手"); } @Override public void buildFoot() { human.setFoot("普通的腳"); } @Override public Human createHuman() { return human; } }
4、Director 建造者模式的核心 調(diào)用具體建造者來(lái)創(chuàng)建不同的人
package com.designpattern.builderPattern; /** * 管理造人的順序 BuilderHuman不同,則創(chuàng)建的人不同 * @author zhongtao on 2018/9/17 */ public class HumanDirector { public Human createHumanByDirector(BuilderHuman builderHuman){ builderHuman.buildHead(); builderHuman.buildBody(); builderHuman.buildHand(); builderHuman.buildFoot(); return builderHuman.createHuman(); } }
5、建造者模式測(cè)試
package com.designpattern.builderPattern; import org.junit.Test; /** * 測(cè)試 * * @author zhongtao on 2018/9/17 */ public class BuilderPatternTest { /** * 測(cè)試建造者模式 */ @Test public void test() { HumanDirector humanDirector = new HumanDirector(); //創(chuàng)建高個(gè)子的人 Human humanByDirector = humanDirector.createHumanByDirector(new TallPersonBuilder()); System.out.println(humanByDirector.getHead()); System.out.println(humanByDirector.getBody()); System.out.println(humanByDirector.getHand()); System.out.println(humanByDirector.getFoot()); System.out.println("------簡(jiǎn)單的分割線(xiàn)------"); //創(chuàng)建聰明的人 Human smartHuman = humanDirector.createHumanByDirector(new SmartHumanBuilder()); System.out.println(smartHuman.getHead()); System.out.println(smartHuman.getBody()); System.out.println(smartHuman.getHand()); System.out.println(smartHuman.getFoot()); } }
三、建造者模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
建造者獨(dú)立,易擴(kuò)展。
便于控制細(xì)節(jié)風(fēng)險(xiǎn)。
缺點(diǎn):
產(chǎn)品必須有共同點(diǎn),范圍有限制。
如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類(lèi)。
注意事項(xiàng):
與工廠(chǎng)模式的區(qū)別,建造者模式更加關(guān)注與零件裝配的順序。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+Redis+Lua防止IP重復(fù)防刷攻擊的方法
本文主要介紹了SpringBoot+Redis+Lua防止IP重復(fù)防刷攻擊的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
Jackson是一個(gè)強(qiáng)大工具,可用于Json、XML、實(shí)體之間的相互轉(zhuǎn)換,JacksonXmlElementWrapper用于指定List等集合類(lèi),外圍標(biāo)簽名,JacksonXmlProperty指定包裝標(biāo)簽名,或者指定標(biāo)簽內(nèi)部屬性名,JacksonXmlRootElement指定生成xml根標(biāo)簽的名字,JacksonXmlText指定當(dāng)前這個(gè)值2024-05-05java基于servlet實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java基于servlet實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Java實(shí)現(xiàn)List去重的幾種方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Java中List去重的幾種常用方法總結(jié),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價(jià)值,需要的小伙伴可以了解一下2023-09-09java 設(shè)計(jì)模式之單例的實(shí)例詳解
這篇文章主要介紹了java 設(shè)計(jì)模式之單例的實(shí)例詳解的相關(guān)資料, 希望通過(guò)本文能幫助到大家,讓大家徹底理解掌握單例模式,需要的朋友可以參考下2017-09-09SpringBoot解決BigDecimal傳到前端后精度丟失問(wèn)題
這篇文章將通過(guò)示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-06-06深入解析Java多態(tài)進(jìn)階學(xué)習(xí)
java的動(dòng)態(tài)綁定機(jī)制非常重要。這篇文章將帶大家更深入的學(xué)習(xí)一下Java的多態(tài),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-07-07Java synchronized關(guān)鍵字使用方式及特性解析
這篇文章主要介紹了Java synchronized關(guān)鍵字使用方式及特性解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07SpringBoot使用AOP統(tǒng)一日志管理的方法詳解
這篇文章主要為大家分享一個(gè)干貨:超簡(jiǎn)潔SpringBoot使用AOP統(tǒng)一日志管理,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05