Java設(shè)計(jì)模式之建造者模式的示例詳解

定義
建造者模式(Builder Pattern),又叫生成器模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶只通過(guò)指定復(fù)雜對(duì)象的類型和內(nèi)容就可 以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
案例
需求
女生每天化妝,假如只需要做發(fā)型,香水,衣服,并要求按照發(fā)型——》香水——》衣服的順序進(jìn)行,用代碼實(shí)現(xiàn)
方案一
定義女生抽象類
/**
* 女生抽象類
* @author:liyajie
* @createTime:2022/2/16 10:20
* @version:1.0
*/
public abstract class AbstractWoman {
//設(shè)計(jì)發(fā)型
public abstract void buildHairstyle();
//使用香水
public abstract void buildPerfume();
//設(shè)計(jì)衣服
public abstract void buildClothing();
}定義女生實(shí)現(xiàn)類
/**
* 女生實(shí)現(xiàn)類
* @author:liyajie
* @createTime:2022/2/16 10:21
* @version:1.0
*/
public class Woman extends AbstractWoman {
@Override
public void buildHairstyle() {
System.out.println("馬尾造型");
}
@Override
public void buildPerfume() {
System.out.println("古龍香水");
}
@Override
public void buildClothing() {
System.out.println("海瀾之家");
}
}測(cè)試類
/**
* 測(cè)試類
* @author:liyajie
* @createTime:2022/2/15 16:35
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
Woman woman = new Woman();
woman.buildHairstyle();
woman.buildPerfume();
woman.buildClothing();
System.out.println(woman);
}
}查看測(cè)試結(jié)果

方案二
定義女生類
/**
* 女生化妝
* @author:liyajie
* @createTime:2022/2/15 15:40
* @version:1.0
*/
@Data
public class WomanNew {
// 發(fā)型
private String hairstyle;
// 香水
private String perfume;
// 服裝
private String clothing;
//化完妝后的展示效果
public void show(){
System.out.println("化妝完成");
}
}定義化妝師抽象類
/**
* 化妝師抽象類
* @author:liyajie
* @createTime:2022/2/15 15:58
* @version:1.0
*/
public abstract class AbstractDresserNew {
protected Woman woman = new Woman();
//設(shè)計(jì)發(fā)型
public abstract void buildHairstyle();
//使用香水
public abstract void buildPerfume();
//設(shè)計(jì)衣服
public abstract void buildClothing();
public Woman getWoman(){
return woman;
}
}定義具體的化妝師類
/**
* 具體的化妝師
* @author:liyajie
* @createTime:2022/2/15 16:17
* @version:1.0
*/
public class DresserNew extends AbstractDresserNew{
@Override
public void buildHairstyle() {
woman.setHairstyle("馬尾造型");
}
@Override
public void buildPerfume() {
woman.setPerfume("古龍香水");
}
@Override
public void buildClothing() {
woman.setClothing("海瀾之家");
}
}定義化妝總設(shè)計(jì)師類(指揮者)
/**
* 化妝總設(shè)計(jì)師(指揮者)
* @author:liyajie
* @createTime:2022/2/15 16:22
* @version:1.0
*/
public class DresserManage {
private AbstractDresser abstractDresser;
public DresserManage(AbstractDresser abstractDresser){
this.abstractDresser = abstractDresser;
}
public Woman makeUp(){
abstractDresser.buildHairstyle();
abstractDresser.buildPerfume();
abstractDresser.buildClothing();
return abstractDresser.getWoman();
}
}定義測(cè)試類
/**
* 測(cè)試類
* @author:liyajie
* @createTime:2022/2/15 16:35
* @version:1.0
*/
public class TestNew {
public static void main(String[] args) {
DresserNew dresser = new DresserNew();
DresserManage dresserManage = new DresserManage(dresser);
WomanNew womanNew = dresserManage.makeUp();
System.out.println(womanNew);
}
}查看結(jié)果

對(duì)比分析
- 方案一:普通的實(shí)現(xiàn)方式,采用了繼承抽象類的方式進(jìn)行實(shí)現(xiàn),耦合性非常高,不易擴(kuò)展
- 方案二:建造者模式,將女生和化妝師化妝進(jìn)行了解耦合,并且易擴(kuò)展,更換化妝師也很方便;并且有一個(gè)化妝總設(shè)計(jì)師作為指揮者的角色,可以方便的控制化妝的順序,符合開(kāi)閉原則
總結(jié)
建造者模式的優(yōu)勢(shì):
將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過(guò)程解耦合
擴(kuò)展性很高,很方便的增加或者替換具體建造者
方便用程序來(lái)控制產(chǎn)品的創(chuàng)建過(guò)程以及順序
指揮者類針對(duì)抽象建造者編程,系統(tǒng)擴(kuò)展方便,符合開(kāi)閉原則
注意點(diǎn)
建造者模式創(chuàng)建的產(chǎn)品一般組成部分類似,如果產(chǎn)品差異性非常大,不適合了,合理利用
如果產(chǎn)品內(nèi)部變化復(fù)雜,導(dǎo)致系統(tǒng)非常龐大,權(quán)衡
到此這篇關(guān)于Java設(shè)計(jì)模式之建造者模式的示例詳解的文章就介紹到這了,更多相關(guān)Java建造者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SWT(JFace)體驗(yàn)之FormLayout布局
SWT(JFace)體驗(yàn)之FormLayout布局示例代碼。2009-06-06
設(shè)置Myeclipse中的代碼格式化、注釋模板及保存時(shí)自動(dòng)格式化
這篇文章主要介紹了設(shè)置Myeclipse中的代碼格式化、注釋模板及保存時(shí)自動(dòng)格式化方法,需要的朋友可以參考下2014-10-10
Java LocalCache 本地緩存的實(shí)現(xiàn)實(shí)例
本篇文章主要介紹了Java LocalCache 本地緩存的實(shí)現(xiàn)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-05-05
java樂(lè)觀鎖原理與實(shí)現(xiàn)案例分析
這篇文章主要介紹了java樂(lè)觀鎖原理與實(shí)現(xiàn),結(jié)合具體案例形式分析了樂(lè)觀鎖的原理及java使用樂(lè)觀鎖實(shí)現(xiàn)自動(dòng)派單功能的相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
springAOP完整實(shí)現(xiàn)過(guò)程
當(dāng)你調(diào)用SimpleService類的doSomething方法時(shí),上述的PerformanceAspect會(huì)自動(dòng)攔截此調(diào)用,并且記錄該方法的執(zhí)行時(shí)間,這樣你就完成了一個(gè)針對(duì)Spring的AOP入門(mén)級(jí)案例,感興趣的朋友一起看看吧2024-02-02
springboot?注解方式批量插入數(shù)據(jù)的實(shí)現(xiàn)
一次請(qǐng)求需要往數(shù)據(jù)庫(kù)插入多條數(shù)據(jù)時(shí),可以節(jié)省大量時(shí)間,本文主要介紹了springboot?注解方式批量插入數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

