Java創(chuàng)建型模式之建造者模式詳解
一.介紹
建造者模式(Builder Pattern)屬于創(chuàng)建型模式。如果一個(gè)對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)或者內(nèi)部屬性本身相互依賴(有順序要求),甚至對(duì)象中的某些屬性的創(chuàng)建也有一個(gè)很復(fù)雜的過(guò)程,就可以使用建造者模式
二.UML類(lèi)圖

三.具體代碼
業(yè)務(wù)代碼
public class Product {
private String part1;
private String part2;
public Product(String part1, String part2) {
this.part1 = part1;
this.part2 = part2;
}
@Override
public String toString() {
return "Product{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
'}';
}
}
//控制每個(gè)部件的具體創(chuàng)建
interface Builder {
void buildPart1(String part1);
void buildPart2(String part2);
Product build();
}
class ChinaBuilder implements Builder{
private String part1;
private String part2;
@Override
public void buildPart1(String part1) {
this.part1 = "國(guó)產(chǎn)" + part1;
}
@Override
public void buildPart2(String part2) {
this.part2 = "國(guó)產(chǎn)" + part2;
}
@Override
public Product build() {
return new Product(part1, part2);
}
}
//控制組裝部件的順序
class Director{
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct(String part1, String part2){
builder.buildPart1(part1);
builder.buildPart2(part2);
return builder.build();
}
}
測(cè)試代碼
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director(new ChinaBuilder());
Product product = director.construct("傳感器", "芯片");
System.out.println(product); //Product{part1='國(guó)產(chǎn)傳感器', part2='國(guó)產(chǎn)芯片'}
}
}
四.lombok的@Builder注解(拓展)
我們先以靜態(tài)內(nèi)部類(lèi)的方式實(shí)現(xiàn)簡(jiǎn)單場(chǎng)景下的建造者模式(以優(yōu)雅的鏈?zhǔn)秸{(diào)用代替set)
業(yè)務(wù)代碼
public class Product {
private String part1;
private String part2;
public Product(String part1, String part2) {
this.part1 = part1;
this.part2 = part2;
}
@Override
public String toString() {
return "Product{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
'}';
}
static class Builder {
private String part1;
private String part2;
public Builder part1(String part1) {
this.part1 = part1;
return this;
}
public Builder part2(String part2) {
this.part2 = part2;
return this;
}
public Product build(){
return new Product(part1, part2);
}
}
}
測(cè)試類(lèi)
public class ProductTest {
public static void main(String[] args) {
Product product = new Product.Builder().part1("傳感器").part2("芯片").build();
System.out.println(product); //Product{part1='傳感器', part2='芯片'}
}
}
下面看看lombok的@Builder注解的實(shí)現(xiàn)
業(yè)務(wù)代碼
@Builder
public class Product {
private String part1;
private String part2;
}
在IDEA中打開(kāi)Product.class文件,可以看出實(shí)際就是使用的簡(jiǎn)單場(chǎng)景的建造者模式
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.designpattern.create.builder.lombok;
public class Product {
private String part1;
private String part2;
Product(String part1, String part2) {
this.part1 = part1;
this.part2 = part2;
}
public static Product.ProductBuilder builder() {
return new Product.ProductBuilder();
}
public static class ProductBuilder {
private String part1;
private String part2;
ProductBuilder() {
}
public Product.ProductBuilder part1(String part1) {
this.part1 = part1;
return this;
}
public Product.ProductBuilder part2(String part2) {
this.part2 = part2;
return this;
}
public Product build() {
return new Product(this.part1, this.part2);
}
public String toString() {
return "Product.ProductBuilder(part1=" + this.part1 + ", part2=" + this.part2 + ")";
}
}
}
五.在Spring中的應(yīng)用
org.springframework.web.servlet.mvc.method.RequestMappingInfo.DefaultBuilder
到此這篇關(guān)于Java創(chuàng)建型模式之建造者模式詳解的文章就介紹到這了,更多相關(guān)Java建造者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot開(kāi)發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
Spring Boot支持容器的自動(dòng)配置,默認(rèn)是Tomcat,當(dāng)然我們也是可以進(jìn)行修改的。這篇文章給大家介紹了spring boot開(kāi)發(fā)遇到坑之spring-boot-starter-web配置文件使用教程,需要的朋友參考下吧2018-01-01
超細(xì)講解Java調(diào)用python文件的幾種方式
有時(shí)候我們?cè)趯?xiě)java的時(shí)候需要調(diào)用python文件,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用python文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼
本篇文章主要介紹了Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn)
本文主要介紹了SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
消息中間件ActiveMQ的簡(jiǎn)單入門(mén)介紹與使用
消息隊(duì)列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成,這篇文章主要給大家介紹了關(guān)于ActiveMQ的簡(jiǎn)單入門(mén)介與使用的相關(guān)資料,需要的朋友可以參考下2021-11-11
了解spring中的CloudNetflix Hystrix彈性客戶端
這篇文章主要介紹了了解spring中的CloudNetflix Hystrix彈性客戶端,客戶端彈性模式是在遠(yuǎn)程服務(wù)發(fā)生錯(cuò)誤或表現(xiàn)不佳時(shí)保護(hù)遠(yuǎn)程資源(另一個(gè)微服務(wù)調(diào)用或者數(shù)據(jù)庫(kù)查詢)免于崩潰。,需要的朋友可以參考下2019-06-06
Java實(shí)戰(zhàn)員工績(jī)效管理系統(tǒng)的實(shí)現(xiàn)流程
只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+HTML實(shí)現(xiàn)一個(gè)員工績(jī)效管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-01-01
淺談MySQL中是如何實(shí)現(xiàn)事務(wù)提交和回滾的
本文主要介紹了MySQL中是如何實(shí)現(xiàn)事務(wù)提交和回滾的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
TransmittableThreadLocal通過(guò)javaAgent實(shí)現(xiàn)線程傳遞并支持ForkJoin
這篇文章主要介紹了TransmittableThreadLocal通過(guò)javaAgent實(shí)現(xiàn)線程傳遞并支持ForkJoin詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

