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