理解java設(shè)計(jì)模式之建造者模式
建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個(gè)復(fù)雜的對象”,在這其中“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對象的各個(gè)部分則經(jīng)常變化。因此, 建造者模式主要用來解決“對象部分”的需求變化。 這樣可以對對象構(gòu)造的過程進(jìn)行更加精細(xì)的控制。
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時(shí) */ public abstract class PersonBuilder { //繪畫一個(gè)人物需要使用到的工具 protected String tool1; protected String tool2; public PersonBuilder(String t1, String t2) { this.tool1 = t1; this.tool2 = t2; } //繪畫頭 public abstract void buildHead(); //畫身體 public abstract void buildBody(); //畫左腳右腳 public abstract void buildArmLeft(); public abstract void buildArmRight(); //畫左手右手 public abstract void buildLegLeft(); public abstract void buildLegRight(); }
我們的抽象生成器派生出相應(yīng)的子類,用來構(gòu)造相應(yīng)的實(shí)際使用類型
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時(shí) */ public class PersonThinBuilder extends PersonBuilder { public PersonThinBuilder(String t1, String t2) { super(t1, t2); } @Override public void buildHead() { System.out.println("畫出一個(gè)瘦子的頭"); } @Override public void buildBody() { System.out.println("畫出一個(gè)瘦子的身體"); } @Override public void buildArmLeft() { System.out.println("畫出瘦子的左臂"); } @Override public void buildArmRight() { System.out.println("畫出瘦子的右臂"); } @Override public void buildLegLeft() { System.out.println("畫出瘦子左腿"); } @Override public void buildLegRight() { System.out.println("畫出瘦子的右腿"); } }
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時(shí) */ public class PersonFatBuilder extends PersonBuilder { public PersonFatBuilder(String t1, String t2) { super(t1, t2); } @Override public void buildHead() { System.out.println("畫出一個(gè)胖子的頭"); } @Override public void buildBody() { System.out.println("畫出一個(gè)胖子的身體"); } @Override public void buildArmLeft() { System.out.println("畫出胖子的左臂"); } @Override public void buildArmRight() { System.out.println("畫出胖子的右臂"); } @Override public void buildLegLeft() { System.out.println("畫出胖子左腿"); } @Override public void buildLegRight() { System.out.println("畫出胖子的右腿"); } }
我們的生成器交給指揮者來實(shí)現(xiàn)創(chuàng)建的動(dòng)作
package com.shejimoshi.create.Builder; /** * 功能:創(chuàng)建人物的指揮者 */ public class PersonDirector { private PersonBuilder pb; //傳遞相應(yīng)的人物創(chuàng)建模型 public PersonDirector(PersonBuilder pber) { this.pb = pber; } //創(chuàng)建一個(gè)人 public void createPerson() { pb.buildHead(); pb.buildBody(); pb.buildArmLeft(); pb.buildArmRight(); pb.buildLegLeft(); pb.buildLegRight(); } }
測試案例:
package com.shejimoshi.create.Builder; /** * 功能:客戶端程序 */ public class Test { //創(chuàng)建相應(yīng)的人物 public static void create(PersonBuilder pb) { //借助參數(shù)傳過來的模型創(chuàng)建相應(yīng)的對象 PersonDirector pd = new PersonDirector(pb); pd.createPerson(); } public static void main(String []args) { PersonThinBuilder ptb = new PersonThinBuilder("圖像工具", "畫筆"); create(ptb); //創(chuàng)建一個(gè)瘦子 System.out.println("=============================================================="); PersonFatBuilder pfb = new PersonFatBuilder("圖像工具", "畫筆"); create(pfb); } }
運(yùn)行結(jié)果:
畫出一個(gè)瘦子的頭 畫出一個(gè)瘦子的身體 畫出瘦子的左臂 畫出瘦子的右臂 畫出瘦子左腿 畫出瘦子的右腿 ============================================================== 畫出一個(gè)胖子的頭 畫出一個(gè)胖子的身體 畫出胖子的左臂 畫出胖子的右臂 畫出胖子左腿 畫出胖子的右腿
以上就是java建造者模式,希望對大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Mybatis動(dòng)態(tài)SQL之if、choose、where、set、trim、foreach標(biāo)記實(shí)例詳解
動(dòng)態(tài)SQL就是動(dòng)態(tài)的生成SQL。接下來通過本文給大家介紹Mybatis動(dòng)態(tài)SQL之if、choose、where、set、trim、foreach標(biāo)記實(shí)例詳解的相關(guān)知識,感興趣的朋友一起看看吧2016-09-09springcloud使用feign調(diào)用服務(wù)時(shí)參數(shù)內(nèi)容過大問題
這篇文章主要介紹了springcloud使用feign調(diào)用服務(wù)時(shí)參數(shù)內(nèi)容過大問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java隨機(jī)數(shù)生產(chǎn)算法實(shí)例
下面小編就為大家?guī)硪黄猨ava隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10java實(shí)現(xiàn)簡單的ATM項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單的ATM項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10詳解在springmvc中解決FastJson循環(huán)引用的問題
本篇文章主要介紹了在springmvc中解決FastJson循環(huán)引用的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01SSM框架實(shí)現(xiàn)分頁和搜索分頁的示例代碼
本篇文章主要介紹了SSM框架實(shí)現(xiàn)分頁和搜索分頁的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03springboot?publish?event?事件機(jī)制demo分享
這篇文章主要介紹了springboot?publish?event?事件機(jī)制demo,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10java 實(shí)現(xiàn)文件復(fù)制和格式更改的實(shí)例
java 實(shí)現(xiàn)文件復(fù)制和格式更改的實(shí)例,需要的朋友可以參考一下2013-03-03