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

三.具體代碼
業(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 + '\'' +
'}';
}
}
//控制每個部件的具體創(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 = "國產(chǎn)" + part1;
}
@Override
public void buildPart2(String part2) {
this.part2 = "國產(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();
}
}
測試代碼
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='國產(chǎn)傳感器', part2='國產(chǎn)芯片'}
}
}
四.lombok的@Builder注解(拓展)
我們先以靜態(tài)內(nèi)部類的方式實現(xiàn)簡單場景下的建造者模式(以優(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);
}
}
}
測試類
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注解的實現(xiàn)
業(yè)務(wù)代碼
@Builder
public class Product {
private String part1;
private String part2;
}
在IDEA中打開Product.class文件,可以看出實際就是使用的簡單場景的建造者模式
//
// 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jar命令修改jar包中的application.yml配置文件
本文主要介紹了jar命令修改jar包中的application.yml配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
解決Java中SimpleDateFormat線程不安全的五種方案
SimpleDateFormat 就是一個典型的線程不安全事例,本文主要介紹了解決Java中SimpleDateFormat線程不安全的五種方案,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解
這篇文章主要介紹了springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
java基礎(chǔ)之初始化ArrayList時直接賦值的4種方式總結(jié)
ArrayList是Java中的一個類,它是Java集合框架中的一部分,用于實現(xiàn)動態(tài)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)之初始化ArrayList時直接賦值的4種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07

