Java設(shè)計模式之Builder建造者模式
一、場景描述
建造者模式同工廠模式、抽象工廠模式一樣,用于創(chuàng)建繼承類對象。
工廠模式:Java設(shè)計模式之工廠模式
抽象工廠模式:Java設(shè)計模式之抽象工廠模式
所不同的是,工廠模式下,各子類實現(xiàn)接口,通過工廠類創(chuàng)建子類對象;而建造者模式下,各子類擁有其建造者類,通過它創(chuàng)建不同的父類對象,最終實現(xiàn)多態(tài),實際上子類、父類在代碼中是不存在的。
以儀器數(shù)據(jù)采集工具為例,工廠模式下,定義接口“儀器數(shù)據(jù)采集工具”,定義子類“PDF文件數(shù)據(jù)采集工具”和“Excel文件數(shù)據(jù)采集工具”,子類實現(xiàn)接口。通過工廠類(無論是靜態(tài)工廠類還是抽象工廠類),創(chuàng)建子類對象,這些對象擁有不同的表現(xiàn)方式,即為多態(tài)。
在建造者模式下,定義父類“儀器數(shù)據(jù)采集工具”,然后通過“PDF文件數(shù)據(jù)采集工具的建造者類”和“Excel文件數(shù)據(jù)采集工具的建造者類”來為“儀器數(shù)據(jù)采集工具”的類對象賦予不同的表現(xiàn)方式(為字段賦予不同的值等),最終實現(xiàn)多態(tài)。
建造者模式下,Director好比導(dǎo)演一般,它來調(diào)用建造者Builder完成對類對象的創(chuàng)建,調(diào)用者調(diào)用Director即可,如下圖所示:

當(dāng)然,工廠模式字面意義是用于創(chuàng)建對象,而建造者模式字面意義是建造不同的對象,兩者能實現(xiàn)類似的功能,但兩者的應(yīng)用場景大可不同。
工廠模式應(yīng)用于某簡單類對象的創(chuàng)建,而建造者模式應(yīng)用于復(fù)雜類對象的建造,具體可百度學(xué)習(xí)體會。
擴(kuò)展時,例如新增Word文件數(shù)據(jù)采集,創(chuàng)建其Builder類即可,該類實現(xiàn)Word文件數(shù)據(jù)采集程序的創(chuàng)建工作;調(diào)用時使用WordBuilder類即可調(diào)用。
二、示例代碼
(父)類:
package lims.designpatterndemo.builderdemo;
public class EquipmentDataCapture {
private String filePath;
private String equipmentData;
//
public String getFilePath(){
return this.filePath;
}
public void setFilePath(String filePath){
this.filePath = filePath;
}
public String getEquipmentData(){
return this.equipmentData;
}
public void setEquipmentData(String equipmentData){
this.equipmentData = equipmentData;
}
}
建造者接口:
package lims.designpatterndemo.builderdemo;
public interface EquipmentDataCaptureBuilder {
//部件
void buildFilePath();
void buildEquipmentData();
//組裝
EquipmentDataCapture buildEquipmentDataCapture();
}
PDF數(shù)據(jù)采集建造者類:
package lims.designpatterndemo.builderdemo;
public class PdfFileCaptureBuilder implements EquipmentDataCaptureBuilder{
//
EquipmentDataCapture capture;
//構(gòu)造
public PdfFileCaptureBuilder(){
capture = new EquipmentDataCapture();
}
//
@Override
public void buildFilePath() {
capture.setFilePath(".pdf");
}
@Override
public void buildEquipmentData() {
capture.setEquipmentData("pdf file content");
}
@Override
public EquipmentDataCapture buildEquipmentDataCapture() {
return capture;
}
}
Excel數(shù)據(jù)采集建造者:
package lims.designpatterndemo.builderdemo;
public class ExcelFileCaptureBuilder implements EquipmentDataCaptureBuilder{
//
EquipmentDataCapture capture;
//構(gòu)造
public ExcelFileCaptureBuilder(){
capture = new EquipmentDataCapture();
}
@Override
public void buildFilePath() {
capture.setFilePath(".xlsx");
}
@Override
public void buildEquipmentData() {
capture.setEquipmentData("excel file content");
}
@Override
public EquipmentDataCapture buildEquipmentDataCapture() {
return capture;
}
}
Director類,可以簡單理解為導(dǎo)演類:
package lims.designpatterndemo.builderdemo;
public class EquipmentDataCaptureDirector {
public EquipmentDataCapture constructEqiupmentDataCapture(EquipmentDataCaptureBuilder builder){
builder.buildFilePath();
builder.buildEquipmentData();
EquipmentDataCapture capture = builder.buildEquipmentDataCapture();
return capture;
}
}
調(diào)用端示例:
package lims.designpatterndemo.builderdemo;
public class BuilderDemo {
public static void main(String[] args) {
EquipmentDataCaptureDirector direcotr = new EquipmentDataCaptureDirector();
EquipmentDataCaptureBuilder builder = new PdfFileCaptureBuilder();
builder = new ExcelFileCaptureBuilder();
EquipmentDataCapture capture = direcotr.constructEqiupmentDataCapture(builder);
System.out.println(capture.getEquipmentData());
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot如何在線程中獲取@Service Bean類
這篇文章主要介紹了SpringBoot如何在線程中獲取@Service Bean類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring AOP實現(xiàn)功能權(quán)限校驗功能的示例代碼
本篇文章主要介紹了Spring AOP實現(xiàn)功能權(quán)限校驗功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
Java語法基礎(chǔ)之循環(huán)結(jié)構(gòu)語句詳解
這篇文章主要為大家詳細(xì)介紹了Java語法基礎(chǔ)之循環(huán)結(jié)構(gòu)語句,感興趣的小伙伴們可以參考一下2016-09-09
Springboot?Filter中注入bean無效為null問題
這篇文章主要介紹了Springboot?Filter中注入bean無效為null問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
常用校驗注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明
這篇文章主要介紹了常用校驗注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
JavaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)(2)
這篇文章主要介紹了JavaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)的第二篇,實現(xiàn)學(xué)生管理系統(tǒng)的查找和添加功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08

