Java結(jié)構(gòu)型設(shè)計(jì)模式中建造者模式示例詳解
建造者模式
概述
建造者模式(Builder Pattern)屬于創(chuàng)建型模式。
它是將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
簡(jiǎn)而言之:建造者模式就是使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象。
建造者模式適用于創(chuàng)建對(duì)象需要很多步驟,但是步驟的順序不一定固定。如果一個(gè)對(duì)象有非常復(fù)雜的內(nèi)部結(jié)構(gòu)(很多屬性),可以將復(fù)雜對(duì)象的創(chuàng)建和使用進(jìn)行分離。
JDK的StringBuilder類(lèi)中append()方法,提供了開(kāi)放構(gòu)造步驟,最后調(diào)用toString0方法就可以獲得一個(gè)構(gòu)造好的完整字符串。其就是一個(gè)建造者模式的體現(xiàn)。
角色
建造者模式提供四個(gè)主要角色:
1.產(chǎn)品(Product)
要?jiǎng)?chuàng)建的產(chǎn)品類(lèi)對(duì)象。
2.建造者抽象(Builder)
建造者的抽象類(lèi),規(guī)范產(chǎn)品對(duì)象的各個(gè)組成部分的建造,一般由子類(lèi)實(shí)現(xiàn)具體的建造過(guò)程。
3.建造者(ConcreteBuilder)
具體的Builder類(lèi),根據(jù)不同的業(yè)務(wù)邏輯,具體化對(duì)象的各個(gè)組成部分的創(chuàng)建。
4.調(diào)用者(Director)
調(diào)用具體的建造者,來(lái)創(chuàng)建對(duì)象的各個(gè)部分,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保正對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.封裝性好,創(chuàng)建和使用分離。
2.擴(kuò)展性好,建造類(lèi)之間獨(dú)立、一定程度上解耦。
缺點(diǎn):
1.產(chǎn)生多余的Builder對(duì)象。
2.產(chǎn)品內(nèi)部發(fā)生變化,建造者都要修改,成本較大。
應(yīng)用場(chǎng)景
1.需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2.需要生成的對(duì)象內(nèi)部屬性本身相互依賴。
3.相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的結(jié)果。
4.當(dāng)初始化一個(gè)對(duì)象特別復(fù)雜,參數(shù)多,而且很多參數(shù)都具有默認(rèn)值時(shí)。
基本使用
生產(chǎn)一輛Car的過(guò)程,需要一系列的步驟,假設(shè)這些步驟可以隨意調(diào)整組合。
創(chuàng)建產(chǎn)品類(lèi)
public class Car { /** * 名稱 */ private String name; /** * 顏色 */ private String color; /** * 價(jià)格 */ private String price; /** * 類(lèi)型 */ private String type; /** * 發(fā)動(dòng)機(jī) */ private String engine; /** * 輪子 */ private String wheel; }
創(chuàng)建建造者類(lèi)
創(chuàng)建建造者類(lèi),將復(fù)雜的構(gòu)造過(guò)程封裝起來(lái),構(gòu)造步驟由使用者決定
public class CarBuilder { private Car car = new Car(); public CarBuilder addName(String name) { car.setName(name); return this; } public CarBuilder addColor(String color) { car.setColor(color); return this; } public CarBuilder addPrice(String price) { car.setPrice(price); return this; } public CarBuilder addType(String type) { car.setType(type); return this; } public CarBuilder addEngine(String engine) { car.setEngine(engine); return this; } public CarBuilder addWheel(String wheel) { car.setWheel(wheel); return this; } public Car build() { return car; } }
使用
public static void main(String[] args) { CarBuilder carBuilder = new CarBuilder(); Car car = carBuilder.addName("奔馳") .addColor("紅色") .addPrice("100萬(wàn)") .addType("轎車(chē)") .addEngine("1.8T") .addWheel("18寸") .build(); System.out.println(car); }
鏈?zhǔn)綄?xiě)法
建造者模式通常是采用鏈?zhǔn)骄幊痰姆绞綐?gòu)造對(duì)象。
具體做法:
將產(chǎn)品類(lèi)添加到建造者類(lèi)中作為內(nèi)部類(lèi),然后將構(gòu)造步驟添加進(jìn)去,完成每個(gè)步驟,都返回this關(guān)鍵字。
創(chuàng)建產(chǎn)品類(lèi)與建造者類(lèi)
public class CarBuilder { @Data public class Car { /** * 品牌 */ private String name; /** * 顏色 */ private String color; /** * 價(jià)格 */ private String price; /** * 類(lèi)型 */ private String type; /** * 發(fā)動(dòng)機(jī) */ private String engine; /** * 輪子 */ private String wheel; } private Car car = new Car(); public CarBuilder addName(String name) { car.setName(name); return this; } public CarBuilder addColor(String color) { car.setColor(color); return this; } public CarBuilder addPrice(String price) { car.setPrice(price); return this; } public CarBuilder addType(String type) { car.setType(type); return this; } public CarBuilder addEngine(String engine) { car.setEngine(engine); return this; } public CarBuilder addWheel(String wheel) { car.setWheel(wheel); return this; } public Car build() { return car; } }
使用
public static void main(String[] args) { CarBuilder carBuilder = new CarBuilder(); carBuilder.addName("奔馳").addColor("紅色").addPrice("100萬(wàn)").addType("跑車(chē)").addEngine("發(fā)動(dòng)機(jī)").addWheel("輪子"); CarBuilder.Car car = carBuilder.build(); System.out.println(car); }
到此這篇關(guān)于Java結(jié)構(gòu)型設(shè)計(jì)模式中建造者模式示例詳解的文章就介紹到這了,更多相關(guān)Java建造者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis plus使用redis作為二級(jí)緩存的方法
這篇文章主要介紹了mybatis plus使用redis作為二級(jí)緩存的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09java interface的兩個(gè)經(jīng)典用法
這篇文章主要為大家詳細(xì)介紹了java interface的兩個(gè)經(jīng)典用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09@Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決
這篇文章主要介紹了@Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09淺述int與string類(lèi)型轉(zhuǎn)換的兩種方法
這篇文章主要介紹了Java中int與string類(lèi)型轉(zhuǎn)換的兩種方法的相關(guān)資料,需要的朋友可以參考下2016-05-05java實(shí)現(xiàn)簡(jiǎn)單登錄界面的實(shí)戰(zhàn)過(guò)程
學(xué)習(xí)JAVA的過(guò)程當(dāng)中,登陸界面是多數(shù)人第一個(gè)實(shí)現(xiàn)的小程序,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)簡(jiǎn)單登錄界面的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼
這篇文章主要介紹了Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能
這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能的相關(guān)資料,這些功能在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09詳解如何在SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果
在一個(gè)完整的項(xiàng)目中,如果每一個(gè)控制器的方法都返回不同的結(jié)果,那么對(duì)項(xiàng)目的維護(hù)和擴(kuò)展都會(huì)很麻煩。因此,本文為大家準(zhǔn)備了SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果的方法,需要的可以參考一下2022-10-10