理解java設(shè)計模式之建造者模式
建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個復(fù)雜的對象”,在這其中“分步驟”是一個穩(wěn)定的算法,而復(fù)雜對象的各個部分則經(jīng)常變化。因此, 建造者模式主要用來解決“對象部分”的需求變化。 這樣可以對對象構(gòu)造的過程進行更加精細(xì)的控制。
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)文章
Java并發(fā)工具類之CountDownLatch詳解
這篇文章主要介紹了Java并發(fā)工具類之CountDownLatch詳解,CountDownLatch可以使一個獲多個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,CountDownLatch可以解決那些一個或者多個線程在執(zhí)行之前必須依賴于某些必要的前提業(yè)務(wù)先執(zhí)行的場景,需要的朋友可以參考下2023-12-12
解決springboot項目不配置數(shù)據(jù)源啟動報錯問題
這篇文章主要介紹了解決springboot項目不配置數(shù)據(jù)源啟動報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
kafka生產(chǎn)者發(fā)送消息流程深入分析講解
本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲。上文說到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進行客戶端與服務(wù)端的通訊協(xié)議2023-03-03

