理解java設(shè)計(jì)模式之建造者模式
建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個(gè)復(fù)雜的對(duì)象”,在這其中“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對(duì)象的各個(gè)部分則經(jīng)常變化。因此, 建造者模式主要用來(lái)解決“對(duì)象部分”的需求變化。 這樣可以對(duì)對(duì)象構(gòu)造的過(guò)程進(jìn)行更加精細(xì)的控制。
package com.shejimoshi.create.Builder;
/**
* 功能:意圖是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
* 適用性:
* 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)
* 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(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)的子類,用來(lái)構(gòu)造相應(yīng)的實(shí)際使用類型
package com.shejimoshi.create.Builder;
/**
* 功能:意圖是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
* 適用性:
* 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)
* 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(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ù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
* 適用性:
* 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)
* 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(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("畫出胖子的右腿");
}
}
我們的生成器交給指揮者來(lái)實(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();
}
}
測(cè)試案例:
package com.shejimoshi.create.Builder;
/**
* 功能:客戶端程序
*/
public class Test
{
//創(chuàng)建相應(yīng)的人物
public static void create(PersonBuilder pb)
{
//借助參數(shù)傳過(guò)來(lái)的模型創(chuàng)建相應(yīng)的對(duì)象
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建造者模式,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。
相關(guān)文章
使用java批量寫入環(huán)境變量的實(shí)現(xiàn)
本文主要介紹了使用java批量寫入環(huán)境變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
Java中定時(shí)器Timer致命缺點(diǎn)案例詳解
這篇文章主要介紹了Java中定時(shí)器Timer致命缺點(diǎn),以Java中定時(shí)器Time為案例整理下我的學(xué)習(xí)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Java并發(fā)工具類之CountDownLatch詳解
這篇文章主要介紹了Java并發(fā)工具類之CountDownLatch詳解,CountDownLatch可以使一個(gè)獲多個(gè)線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,CountDownLatch可以解決那些一個(gè)或者多個(gè)線程在執(zhí)行之前必須依賴于某些必要的前提業(yè)務(wù)先執(zhí)行的場(chǎng)景,需要的朋友可以參考下2023-12-12
解決springboot項(xiàng)目不配置數(shù)據(jù)源啟動(dòng)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了解決springboot項(xiàng)目不配置數(shù)據(jù)源啟動(dòng)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
kafka生產(chǎn)者發(fā)送消息流程深入分析講解
本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲(chǔ)。上文說(shuō)到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進(jìn)行客戶端與服務(wù)端的通訊協(xié)議2023-03-03

