Java創(chuàng)建型模式之建造者模式詳解
一.介紹
建造者模式(Builder Pattern)屬于創(chuàng)建型模式。如果一個(gè)對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)或者內(nèi)部屬性本身相互依賴(有順序要求),甚至對象中的某些屬性的創(chuàng)建也有一個(gè)很復(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 + '\'' + '}'; } } //控制每個(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 = "國產(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)部類的方式實(shí)現(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注解的實(shí)現(xiàn)
業(yè)務(wù)代碼
@Builder public class Product { private String part1; private String part2; }
在IDEA中打開Product.class文件,可以看出實(shí)際就是使用的簡單場景的建造者模式
// // 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í)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06解決Java中SimpleDateFormat線程不安全的五種方案
SimpleDateFormat 就是一個(gè)典型的線程不安全事例,本文主要介紹了解決Java中SimpleDateFormat線程不安全的五種方案,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解
這篇文章主要介紹了springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10java基礎(chǔ)之初始化ArrayList時(shí)直接賦值的4種方式總結(jié)
ArrayList是Java中的一個(gè)類,它是Java集合框架中的一部分,用于實(shí)現(xiàn)動態(tài)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)之初始化ArrayList時(shí)直接賦值的4種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07