最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之建造者模式的示例詳解

 更新時間:2022年10月28日 16:54:14   作者:游坦之  
建造者模式,是一種對象構建模式?它可以將復雜對象的建造過程抽象出來,使這個抽象過程的不同實現(xiàn)方法可以構造出不同表現(xiàn)的對象。本文將通過示例講解建造者模式,需要的可以參考一下

1 定義

建造者模式(Builder Patten):將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。

建造者模式用于一步一步創(chuàng)建一個復雜的對象,他允許用戶只通過指定復雜對象的類型和內(nèi)容進行構建,用戶不需要知道內(nèi)部的具體構建細節(jié)。建造者模式屬于對象創(chuàng)建型模式,根據(jù)翻譯的不同,建造者模式又可稱為生成器模式。

2 結構與角色

建造者模式包含4個角色

  • Builder:抽象建造者。為創(chuàng)建一個Product對象的各個部件指定的抽象接口。
  • ConcreteBuilder:具體建造者。實現(xiàn)抽象建造者Builder,構建和裝配產(chǎn)品的各個部件。做具體建造工作,但卻不為客戶端所知。
  • Product:產(chǎn)品,被構建的復雜對象。具體建造者創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。包含定義組成部件的類,包括將這些部件裝配成最終的產(chǎn)品的接口。
  • Director:指揮者。構建一個使用抽象建造者Builder的對象。它與客戶端打交道,將客戶端創(chuàng)建產(chǎn)品的請求劃分為對各個零件的建造請求,再將這些請求委派給ConcreteBuilders。

3 例子

建造樓房的過程中,有專業(yè)人員繪制圖紙,圖紙中講述干什么,工人根據(jù)圖紙去具體實現(xiàn)要干的事情,包工頭根據(jù)實際情況去處理圖紙中方法的執(zhí)行,調(diào)配工人以何種順序完成圖紙上的要求。雖然包工頭和圖紙對建造高樓很有幫助,但是高樓平地起,卻是由工人們一磚一瓦的搭建起來。

以上的這個例子很形象的講述建造者模式執(zhí)行過程,其中圖紙就對應Builder(提供方法,要干什么),工人就對應ConcreteBuilder(具體去干方法中規(guī)定的事情),包工頭就對應Director(以何種順序干,調(diào)配工人),高樓就對應Product。

3.1 代碼

3.1.1 Builder類

Builder類只提供抽象的方法,類似于圖紙,只是告訴你建造高樓你需要做什么。

// 抽象方法,要做什么:建設一個大樓需要做什么
public abstract class Builder {
    abstract void builderA();
    abstract void builderB();
    abstract void builderC();
    abstract void builderD();
    abstract Product getProduct();
}

3.1.2 Worker類

工人是具體實現(xiàn)Builder提出的需求,比如水泥、鋼筋等等。工人類直接產(chǎn)生產(chǎn)品(new)

package demo01;
// 知道了要做什么,就得有人來具體實現(xiàn)
public class Worker extends Builder{
    private Product product;
    public Worker() {
        product = new Product();
    }
    @Override
    void builderA() {
        product.setBuildA("打地基");
        System.out.println("打地基");
    }
    @Override
    void builderB() {
        product.setBuildB("鋼筋混凝土");
        System.out.println("鋼筋混凝土");
    }
    @Override
    void builderC() {
        product.setBuildC("蓋房子");
        System.out.println("蓋房子");
    }
    @Override
    void builderD() {
        product.setBuildD("油漆、粉刷");
        System.out.println("油漆、粉刷");
    }
    Product getProduct()
    {
        return product;
    }
}

3.1.3 Product類

當產(chǎn)品的本身的屬性一一被滿足的時候,產(chǎn)品才會產(chǎn)生。

public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;
    public String getBuildA() {
        return buildA;
    }
    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }
    public String getBuildB() {
        return buildB;
    }
    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }
    public String getBuildC() {
        return buildC;
    }
    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }
    public String getBuildD() {
        return buildD;
    }
    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }
    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

3.1.4 Director類

包工頭,安排工人怎么去做,比如今天下雨,不打水泥了,去抬鋼筋,今天不下雨了,去打地基。

// 指揮的作用是,以什么樣的順序,完成產(chǎn)品的制作
public class Director {
    public Product getProduct(Builder builder){
        builder.builderA();
        builder.builderB();
        builder.builderC();
        builder.builderD();
        return builder.getProduct();
    }
}

3.1.5 Test測試類

public class Test01 {
    public static void main(String[] args) {
        Director director = new Director();
        Product product = director.getProduct(new Worker());
        System.out.println(product.toString());
    }
}

指揮者調(diào)整順序可以得到不同的產(chǎn)品,或者不同的效果(雖然這個沒體現(xiàn)出來)

4 不使用指揮者的例子

去餐廳吃飯,餐廳里一般有默認的套餐,或者自己(用戶)點餐,點餐之后,服務員根據(jù)訂單負責將食品端上來,然后你大快朵頤,享受美食帶來的快感…

在這一場景里,就沒有指揮者,指揮權到達了用戶的手里。上面3中的場景,指揮權就不能到用戶手里,你不能讓人家掏錢還得讓人家自己建(除非是老板)。

4.1 Builder類

public abstract class Builder {
    abstract Builder builderA(String msg);
    abstract Builder builderB(String msg);
    abstract Builder builderC(String msg);
    abstract Builder builderD(String msg);
    abstract Product getProduct();
}

4.2 Worker類

public class Worker extends Builder {
    private Product product;
    public Worker() {
         product = new Product();
    }
    Builder builderA(String msg) {
        product.setBuildA(msg);
        return this;
    }
    Builder builderB(String msg) {
        product.setBuildB(msg);
        return this;
    }
    Builder builderC(String msg) {
        product.setBuildC(msg);
        return this;
    }
    Builder builderD(String msg) {
        product.setBuildD(msg);
        return this;
    }
    Product getProduct() {
        return product;
    }
}

4.3 Product類

public class Product {
    private String buildA = "炸雞";
    private String buildB = "漢堡";
    private String buildC = "可樂";
    private String buildD = "大蒜";
    public String getBuildA() {
        return buildA;
    }
    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }
    public String getBuildB() {
        return buildB;
    }
    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }
    public String getBuildC() {
        return buildC;
    }
    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }
    public String getBuildD() {
        return buildD;
    }
    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }
    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

4.4 Test類

public class Test {
    public static void main(String[] args) {
        Worker worker = new Worker();
        System.out.println(worker.builderA("全家桶")
                .getProduct());
    }
}

上面的代碼例子中:Worker就相當于服務員,記錄你點了什么菜,并生成賬單(Product里的信息),反饋給用戶產(chǎn)品。

5 適用場景

  • 需要生成的產(chǎn)品對象有復雜的內(nèi)部結構(通常包含多個成員屬性)
  • 需要生成的產(chǎn)品對象的屬性相互依賴(需要指定順序)
  • 產(chǎn)品對象的創(chuàng)建過程獨立于創(chuàng)建該對象的類
  • 隔離復雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的類

6 優(yōu)缺點

6.1 優(yōu)點

  • 用戶不需要知道產(chǎn)品內(nèi)部組成的細節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。
  • 很方便的替換具體的建造者或者增加新的具體創(chuàng)建者
  • 符合開閉原則,可以更加精細的控制產(chǎn)品的創(chuàng)建過程

6.2 缺點

  • 適用范圍收到限制,需要生成的產(chǎn)品對象具有較多共同點
  • 如果產(chǎn)品的內(nèi)部變化復雜,可能會導致需要定義很多具體建造者類來實現(xiàn)這種變化。

到此這篇關于Java設計模式之建造者模式的示例詳解的文章就介紹到這了,更多相關Java建造者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析非對稱加密在接口參數(shù)中的實現(xiàn)

    淺析非對稱加密在接口參數(shù)中的實現(xiàn)

    接口層做數(shù)據(jù)加密應該算是老生常談的一件事了,業(yè)界用的比較多的,不外乎是對稱加密,非對稱加密以及兩者的結合。本文就來聊聊非對稱加密在接口參數(shù)中的實現(xiàn),希望對大家有所幫助
    2023-02-02
  • Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData

    Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData

    這篇文章主要來和大家分享一個Java技巧,那就是利用RxJava打造可觀測數(shù)據(jù)RxLiveData,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-06-06
  • 簡單了解JAVA構造方法

    簡單了解JAVA構造方法

    構造方法作用就是對類進行初始化。 如果你沒有定議任何構造方法的形式,程式會為你取一個不帶任何參數(shù)的構造函數(shù),那么你產(chǎn)生類的對像時只能用不帶參數(shù)的方法.下面小編和大家來一起學習一下吧
    2019-06-06
  • java Volatile與Synchronized的區(qū)別

    java Volatile與Synchronized的區(qū)別

    這篇文章主要介紹了java Volatile與Synchronized的區(qū)別,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • SpringBoot整合Elasticsearch7.2.0的實現(xiàn)方法

    SpringBoot整合Elasticsearch7.2.0的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合Elasticsearch7.2.0的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • springcloud初體驗(真香)

    springcloud初體驗(真香)

    這篇文章主要介紹了springcloud初體驗(真香),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java實現(xiàn)鏈表的常見操作算法詳解

    Java實現(xiàn)鏈表的常見操作算法詳解

    這篇文章主要介紹了Java實現(xiàn)鏈表的常見操作算法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • java日常練習題,每天進步一點點(1)

    java日常練習題,每天進步一點點(1)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot整合Mybatis-Plus、Jwt實現(xiàn)登錄token設置

    SpringBoot整合Mybatis-Plus、Jwt實現(xiàn)登錄token設置

    Spring Boot整合Mybatis-plus實現(xiàn)登錄常常需要使用JWT來生成用戶的token并設置用戶權限的攔截器,本文就來詳細的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Spring中自定義攔截器的使用

    Spring中自定義攔截器的使用

    大家好,本篇文章主要講的是Spring中自定義攔截器的使用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論

通州市| 小金县| 遂川县| 临泽县| 高要市| 西平县| 囊谦县| 黄山市| 临汾市| 通辽市| 兴隆县| 都安| 乌兰县| 铁岭市| 图片| 景洪市| 肥乡县| 酒泉市| 镇平县| 安新县| 天津市| 阳东县| 大冶市| 乌兰县| 寻乌县| 镇安县| 承德县| 景德镇市| 河东区| 上杭县| 芒康县| 怀宁县| 龙陵县| 新疆| 安远县| 舟曲县| 汽车| 东宁县| 通辽市| 佛坪县| 健康|