Java創(chuàng)建型設(shè)計(jì)模式之建造者模式詳解
建造者模式是Java中一種創(chuàng)建型設(shè)計(jì)模式,它的主要目的是將一個(gè)復(fù)雜對(duì)象的構(gòu)建過(guò)程分解為多個(gè)簡(jiǎn)單對(duì)象的構(gòu)建過(guò)程,并且使這些構(gòu)建過(guò)程按照一定的順序進(jìn)行組裝,最終實(shí)現(xiàn)對(duì)復(fù)雜對(duì)象的創(chuàng)建。本文將詳細(xì)介紹Java中的建造者模式,包括它的定義、結(jié)構(gòu)、實(shí)現(xiàn)方法以及應(yīng)用場(chǎng)景等方面。
前言
當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)具有多個(gè)屬性或組件的對(duì)象時(shí),通常需要使用大量的構(gòu)造函數(shù)和setter方法。隨著屬性或組件的增加,這種方式很容易變得混亂和難以維護(hù)。此時(shí),建造者模式就可以很好地解決這個(gè)問(wèn)題。
建造者模式將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)步驟,由調(diào)用端根據(jù)需要選擇所需的步驟,并按照一定的順序進(jìn)行組裝,最終實(shí)現(xiàn)對(duì)復(fù)雜對(duì)象的創(chuàng)建。通過(guò)使用建造者模式,可以將對(duì)象的構(gòu)建過(guò)程和具體的構(gòu)建實(shí)現(xiàn)分離開(kāi)來(lái),從而提高代碼的可維護(hù)性和可讀性。
定義
建造者模式是一種創(chuàng)建型模式,其定義如下:
將一個(gè)復(fù)雜對(duì)象的構(gòu)建過(guò)程與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
換句話(huà)說(shuō),建造者模式將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)簡(jiǎn)單對(duì)象的構(gòu)建過(guò)程,并按照一定的順序進(jìn)行組裝,從而實(shí)現(xiàn)對(duì)復(fù)雜對(duì)象的創(chuàng)建。通過(guò)使用建造者模式,可以使對(duì)象的構(gòu)建過(guò)程和具體的構(gòu)建實(shí)現(xiàn)相互獨(dú)立,從而提高代碼的可維護(hù)性和可讀性。
結(jié)構(gòu)
建造者模式包含以下幾個(gè)角色:
1.產(chǎn)品類(lèi)(Product)
產(chǎn)品類(lèi)是一個(gè)具有多個(gè)屬性或組件的復(fù)雜對(duì)象,它由多個(gè)簡(jiǎn)單對(duì)象組成。
public class Product {
private String part1;
private String part2;
private String part3;
// 省略 getter 和 setter 方法
}2.抽象建造者類(lèi)(Builder)
建造者類(lèi)是一個(gè)抽象類(lèi)或接口,它定義了創(chuàng)建產(chǎn)品對(duì)象的各個(gè)部分的抽象方法。在實(shí)際應(yīng)用中,通常需要定義多個(gè)不同的建造者類(lèi)來(lái)創(chuàng)建不同類(lèi)型的產(chǎn)品對(duì)象。
public interface Builder {
void buildPart1();
void buildPart2();
void buildPart3();
Product getResult();
}3.具體建造者類(lèi)(ConcreteBuilder)
具體建造者類(lèi)是抽象建造者類(lèi)的子類(lèi),它實(shí)現(xiàn)了抽象建造者類(lèi)中定義的所有抽象方法,并且根據(jù)具體需求組裝產(chǎn)品對(duì)象的各個(gè)部分。
public class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPart1() {
product.setPart1("part1");
}
@Override
public void buildPart2() {
product.setPart2("part2");
}
@Override
public void buildPart3() {
product.setPart3("part3");
}
@Override
public Product getResult() {
return product;
}
}4.指導(dǎo)者類(lèi)(Director)
指導(dǎo)者類(lèi)負(fù)責(zé)創(chuàng)建具體建造者類(lèi)的實(shí)例,并調(diào)用具體建造者類(lèi)中的方法來(lái)組裝產(chǎn)品對(duì)象的各個(gè)部分。在實(shí)際應(yīng)用中,通常只需要一個(gè)指導(dǎo)者類(lèi)即可。
public class Director {
public void construct(Builder builder) {
builder.buildPart1();
builder.buildPart2();
builder.buildPart3();
}
}以上就是建造者模式的結(jié)構(gòu),下面我們來(lái)詳細(xì)說(shuō)明其實(shí)現(xiàn)方法。
實(shí)現(xiàn)方法
在實(shí)際使用建造者模式時(shí),通常需要按照以下步驟進(jìn)行操作:
1.定義產(chǎn)品類(lèi)
首先,需要定義一個(gè)具有多個(gè)屬性或組件的復(fù)雜對(duì)象,即產(chǎn)品類(lèi)。
2.定義抽象建造者類(lèi)
接著,需要定義一個(gè)抽象建造者類(lèi)或接口,其中包含了創(chuàng)建產(chǎn)品對(duì)象各個(gè)部分的抽象方法。
3.定義具體建造者類(lèi)
然后,需要定義一個(gè)或多個(gè)具體建造者類(lèi),它們是抽象建造者類(lèi)的子類(lèi),實(shí)現(xiàn)了抽象建造者類(lèi)中定義的抽象方法,并且根據(jù)具體需求組裝產(chǎn)品對(duì)象的各個(gè)部分。
4.定義指導(dǎo)者類(lèi)
最后,需要定義一個(gè)指導(dǎo)者類(lèi),它負(fù)責(zé)創(chuàng)建具體建造者類(lèi)的實(shí)例,并調(diào)用具體建造者類(lèi)中的方法來(lái)組裝產(chǎn)品對(duì)象的各個(gè)部分。在實(shí)際應(yīng)用中,通常只需要一個(gè)指導(dǎo)者類(lèi)即可。
5.使用建造者模式創(chuàng)建對(duì)象
最后,我們可以使用建造者模式來(lái)創(chuàng)建對(duì)象,即先創(chuàng)建一個(gè)具體建造者類(lèi)的實(shí)例,然后將該實(shí)例交給指導(dǎo)者類(lèi)進(jìn)行組裝,最終得到一個(gè)完整的產(chǎn)品對(duì)象。
Builder builder = new ConcreteBuilder(); Director director = new Director(); director.construct(builder); Product product = builder.getResult();
以上就是建造者模式的實(shí)現(xiàn)方法,下面我們來(lái)介紹一下它的應(yīng)用場(chǎng)景。
應(yīng)用場(chǎng)景
建造者模式適用于以下場(chǎng)景:
1.對(duì)象的構(gòu)建過(guò)程比較復(fù)雜
當(dāng)需要?jiǎng)?chuàng)建的對(duì)象較為復(fù)雜,需要通過(guò)多個(gè)步驟來(lái)生成時(shí),可以使用建造者模式。
2.需要生成不同表示的對(duì)象
當(dāng)需要按照不同的邏輯順序來(lái)創(chuàng)建對(duì)象時(shí),或者需要生成不同表示的對(duì)象時(shí),可以使用建造者模式。
3.希望分離對(duì)象的構(gòu)建過(guò)程和表示
當(dāng)希望分離對(duì)象的構(gòu)建過(guò)程和具體表示時(shí),可以使用建造者模式。
例如,在Java中,StringBuilder就是使用了建造者模式。在程序中,我們經(jīng)常需要拼接字符串,如果使用String類(lèi)型來(lái)拼接字符串,每次拼接都會(huì)創(chuàng)建一個(gè)新的String對(duì)象,會(huì)浪費(fèi)大量的內(nèi)存。而使用StringBuilder,它將所需的字符串逐個(gè)添加進(jìn)去,并在需要時(shí)將它們組裝成一個(gè)完整的字符串對(duì)象,從而避免了不必要的內(nèi)存浪費(fèi)。
另外,在Java中,JDK中提供的Calendar類(lèi)也使用了建造者模式。在創(chuàng)建日期時(shí)間對(duì)象時(shí),需要設(shè)置年、月、日、時(shí)、分、秒等信息,如果使用普通的構(gòu)造函數(shù)或setter方法來(lái)設(shè)置這些信息,會(huì)使得代碼變得冗長(zhǎng)且難以維護(hù)。而通過(guò)使用Calendar類(lèi)提供的建造者模式,可以將這些設(shè)置信息分解為多個(gè)簡(jiǎn)單的步驟,并按照一定的順序進(jìn)行組裝,從而實(shí)現(xiàn)對(duì)日期時(shí)間對(duì)象的創(chuàng)建。
總結(jié)
通過(guò)本文的介紹,我們了解了Java中的建造者模式,包括它的定義、結(jié)構(gòu)、實(shí)現(xiàn)方法以及應(yīng)用場(chǎng)景等方面。建造者模式將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)簡(jiǎn)單對(duì)象的構(gòu)建過(guò)程,并按照一定的順序進(jìn)行組裝,最終實(shí)現(xiàn)對(duì)復(fù)雜對(duì)象的創(chuàng)建。通過(guò)使用建造者模式,可以將對(duì)象的構(gòu)建過(guò)程和具體的構(gòu)建實(shí)現(xiàn)分離開(kāi)來(lái),從而提高代碼的可維護(hù)性和可讀性。
到此這篇關(guān)于Java創(chuàng)建型設(shè)計(jì)模式之建造者模式詳解的文章就介紹到這了,更多相關(guān)Java建造者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring event 事件異步處理方式(發(fā)布,監(jiān)聽(tīng),異步處理)
這篇文章主要介紹了spring event 事件異步處理方式(發(fā)布,監(jiān)聽(tīng),異步處理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Spring?Boot?3?整合?MinIO?實(shí)現(xiàn)分布式文件存儲(chǔ)的全過(guò)程
本文介紹了如何使用SpringBoot3和MinIO實(shí)現(xiàn)分布式文件存儲(chǔ),通過(guò)MinIO的分布式對(duì)象存儲(chǔ)系統(tǒng),可以解決傳統(tǒng)單機(jī)文件存儲(chǔ)方案在面對(duì)大規(guī)模數(shù)據(jù)和高并發(fā)訪問(wèn)時(shí)的不足,文章詳細(xì)講解了MinIO的安裝、配置和使用,感興趣的朋友一起看看吧2025-03-03
SpringBoot的@RestControllerAdvice作用詳解
這篇文章主要介紹了SpringBoot的@RestControllerAdvice作用詳解,@RestContrllerAdvice是一種組合注解,由@ControllerAdvice,@ResponseBody組成,本質(zhì)上就是@Component,需要的朋友可以參考下2024-01-01
mybatis中Oracle參數(shù)為NULL錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了mybatis中Oracle參數(shù)為NULL錯(cuò)誤問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
SpringCloud網(wǎng)關(guān)(Zuul)如何給多個(gè)微服務(wù)之間傳遞共享參數(shù)
這篇文章主要介紹了SpringCloud網(wǎng)關(guān)(Zuul)如何給多個(gè)微服務(wù)之間傳遞共享參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
spring cloud學(xué)習(xí)教程之config修改配置詳解
這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)教程之config修改配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接
字符串拼接是我們?cè)贘ava代碼中比較經(jīng)常要做的事情,就是把多個(gè)字符串拼接到一起,這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接的相關(guān)資料,需要的朋友可以參考下2021-08-08

