java實(shí)現(xiàn)建造者模式(Builder Pattern)
一、什么是建筑者模式?
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建一個復(fù)雜的對象。
一個 Builder 類會一步一步構(gòu)造最終的對象,該 Builder 類獨(dú)立于其他對象。
建造者模式主要解決在軟件系統(tǒng)中,有時候面臨著"一個復(fù)雜對象"的創(chuàng)建工作,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化,這個復(fù)雜對象的各個部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對穩(wěn)定。
二、建造者模式的具體實(shí)現(xiàn)
結(jié)構(gòu)圖

建造者模式中的四個角色:
1、Builder:給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造。這個接口規(guī)定要實(shí)現(xiàn)復(fù)雜對象的哪些部分的創(chuàng)建,并不涉及具體的對象部件的創(chuàng)建。
2、ConcreteBuilder:實(shí)現(xiàn)Builder接口,針對不同的商業(yè)邏輯,具體化復(fù)雜對象的各部分的創(chuàng)建。 在建造過程完成后,提供產(chǎn)品的實(shí)例。
3、Director:調(diào)用具體建造者來創(chuàng)建復(fù)雜對象的各個部分,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保證對象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
4、Product:要創(chuàng)建的復(fù)雜對象。
java代碼實(shí)現(xiàn)
1、創(chuàng)建人類實(shí)體類
package com.designpattern.builderPattern;
/**
* 對象 人
*
* @author zhongtao on 2018/9/17
*/
public class Human {
private String head;
private String body;
private String hand;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getHand() {
return hand;
}
public void setHand(String hand) {
this.hand = hand;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
2、創(chuàng)建造人的 Builder 接口
package com.designpattern.builderPattern;
/**
* 造人接口 規(guī)定造人的規(guī)范 需要頭、身體、手、腳
*
* @author zhongtao on 2018/9/17
*/
public interface BuilderHuman {
void buildHead();
void buildBody();
void buildHand();
void buildFoot();
/**
* 返回創(chuàng)建的對象
*/
Human createHuman();
}
3、ConcreteBuilder 創(chuàng)建不同類型的人
tallPerson
package com.designpattern.builderPattern;
/**
* 高個子的人
*
* @author zhongtao on 2018/9/17
*/
public class TallPersonBuilder implements BuilderHuman {
Human human;
public TallPersonBuilder() {
human = new Human();
}
@Override
public void buildHead() {
human.setHead("普通的頭腦");
}
@Override
public void buildBody() {
human.setBody("壯實(shí),高大的身體");
}
@Override
public void buildHand() {
human.setHand("長手");
}
@Override
public void buildFoot() {
human.setFoot("長腳");
}
@Override
public Human createHuman() {
return human;
}
}
smartHuman
package com.designpattern.builderPattern;
/**
* 聰明的人
*
* @author zhongtao on 2018/9/17
*/
public class SmartHumanBuilder implements BuilderHuman {
Human human;
public SmartHumanBuilder() {
human = new Human();
}
@Override
public void buildHead() {
human.setHead("高智商的頭腦");
}
@Override
public void buildBody() {
human.setBody("健康的身體");
}
@Override
public void buildHand() {
human.setHand("普通的手");
}
@Override
public void buildFoot() {
human.setFoot("普通的腳");
}
@Override
public Human createHuman() {
return human;
}
}
4、Director 建造者模式的核心 調(diào)用具體建造者來創(chuàng)建不同的人
package com.designpattern.builderPattern;
/**
* 管理造人的順序 BuilderHuman不同,則創(chuàng)建的人不同
* @author zhongtao on 2018/9/17
*/
public class HumanDirector {
public Human createHumanByDirector(BuilderHuman builderHuman){
builderHuman.buildHead();
builderHuman.buildBody();
builderHuman.buildHand();
builderHuman.buildFoot();
return builderHuman.createHuman();
}
}
5、建造者模式測試
package com.designpattern.builderPattern;
import org.junit.Test;
/**
* 測試
*
* @author zhongtao on 2018/9/17
*/
public class BuilderPatternTest {
/**
* 測試建造者模式
*/
@Test
public void test() {
HumanDirector humanDirector = new HumanDirector();
//創(chuàng)建高個子的人
Human humanByDirector = humanDirector.createHumanByDirector(new TallPersonBuilder());
System.out.println(humanByDirector.getHead());
System.out.println(humanByDirector.getBody());
System.out.println(humanByDirector.getHand());
System.out.println(humanByDirector.getFoot());
System.out.println("------簡單的分割線------");
//創(chuàng)建聰明的人
Human smartHuman = humanDirector.createHumanByDirector(new SmartHumanBuilder());
System.out.println(smartHuman.getHead());
System.out.println(smartHuman.getBody());
System.out.println(smartHuman.getHand());
System.out.println(smartHuman.getFoot());
}
}
三、建造者模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
建造者獨(dú)立,易擴(kuò)展。
便于控制細(xì)節(jié)風(fēng)險(xiǎn)。
缺點(diǎn):
產(chǎn)品必須有共同點(diǎn),范圍有限制。
如內(nèi)部變化復(fù)雜,會有很多的建造類。
注意事項(xiàng):
與工廠模式的區(qū)別,建造者模式更加關(guān)注與零件裝配的順序。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用Redis對用戶IP進(jìn)行接口限流的示例詳解
使用接口限流的主要目的在于提高系統(tǒng)的穩(wěn)定性,防止接口被惡意打擊,這篇文章主要介紹了SpringBoot使用Redis對用戶IP進(jìn)行接口限流的示例代碼,需要的朋友可以參考下2023-07-07
SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇)
這篇文章主要介紹了SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
如何基于SpringSecurity的@PreAuthorize實(shí)現(xiàn)自定義權(quán)限校驗(yàn)方法
spring Security提供有若干個過濾器,它們能夠攔截Servlet請求,并將這些請求轉(zhuǎn)給認(rèn)證和訪問決策管理器處理,從而增強(qiáng)安全性,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringSecurity的@PreAuthorize實(shí)現(xiàn)自定義權(quán)限校驗(yàn)方法的相關(guān)資料,需要的朋友可以參考下2023-03-03
Spring源碼如何修改Bean的屬性用到的相關(guān)類
這篇文章主要介紹了Spring源碼如何修改Bean的屬性用到的相關(guān)類,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析
這篇文章主要介紹了LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
mybatis多數(shù)據(jù)源動態(tài)切換的完整步驟
這篇文章主要給大家介紹了關(guān)于mybatis多數(shù)據(jù)源動態(tài)切換的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
關(guān)于SpringBoot中的XA事務(wù)詳解
這篇文章主要介紹了關(guān)于SpringBoot中的XA事務(wù)詳解,事務(wù)管理可以確保數(shù)據(jù)的一致性和完整性,同時也可以避免數(shù)據(jù)丟失和沖突等問題。在分布式環(huán)境中,XA?事務(wù)是一種常用的事務(wù)管理方式,需要的朋友可以參考下2023-07-07

