欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java創(chuàng)建型模式之建造者模式詳解

 更新時(shí)間:2023年02月17日 15:45:28   作者:非凡的小笨魚  
建造者模式,是一種對象構(gòu)建模式 它可以將復(fù)雜對象的建造過程抽象出來,使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象。本文將通過示例講解建造者模式,需要的可以參考一下

一.介紹

建造者模式(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配置文件

    本文主要介紹了jar命令修改jar包中的application.yml配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 解決Java中SimpleDateFormat線程不安全的五種方案

    解決Java中SimpleDateFormat線程不安全的五種方案

    SimpleDateFormat 就是一個(gè)典型的線程不安全事例,本文主要介紹了解決Java中SimpleDateFormat線程不安全的五種方案,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • SpringAOP中的通知Advice詳解

    SpringAOP中的通知Advice詳解

    這篇文章主要介紹了SpringAOP中的通知Advice詳解,Spring 的 AOP 功能中一個(gè)關(guān)鍵概念是通知Advice與切點(diǎn)Pointcut表達(dá)式相關(guān)聯(lián)在特定節(jié)點(diǎn)織入一些邏輯,Spring 提供了五種類型的通知,需要的朋友可以參考下
    2023-08-08
  • java發(fā)送http get請求的兩種方式

    java發(fā)送http get請求的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java發(fā)送http get請求的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解

    springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解

    這篇文章主要介紹了springmvc圖片上傳及json數(shù)據(jù)轉(zhuǎn)換過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java生成唯一id的幾種實(shí)現(xiàn)方式

    Java生成唯一id的幾種實(shí)現(xiàn)方式

    本文主要介紹了Java生成唯一id的幾種實(shí)現(xiàn)方式,主要介紹了5種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • JavaWeb之Filter與Listener使用解析

    JavaWeb之Filter與Listener使用解析

    這篇文章主要介紹了JavaWeb之Filter與Listener使用解析,Filter表示過濾器,是JavaWeb三大組件(Servlet、Filter、Listener)之一,過濾器可以把對資源的請求攔截下來,從而實(shí)現(xiàn)一些特殊的功能,需要的朋友可以參考下
    2024-01-01
  • java基礎(chǔ)之初始化ArrayList時(shí)直接賦值的4種方式總結(jié)

    java基礎(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
  • springboot自動配置原理解析

    springboot自動配置原理解析

    這篇文章主要介紹了springboot自動配置原理解析,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下
    2021-04-04

最新評論