成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式-建造者模式

txgcwm / 463人閱讀

摘要:在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。該種場(chǎng)景只能是一個(gè)補(bǔ)償方法,因?yàn)橐粋€(gè)對(duì)象不容易獲得,而在設(shè)計(jì)階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計(jì)的最初目標(biāo)。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪

定義
Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.

將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

實(shí)現(xiàn) 產(chǎn)品類

由多個(gè)部件組成

public class Product {

    private String partA;
    private String partB;

    public String getPartA() {
        return partA;
    }

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public String getPartB() {
        return partB;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    @Override
    public String toString() {
        return "partA:" + partA + ", partB:" + partB;
    }
}
抽象建造者

規(guī)范產(chǎn)品的組建,一般是由子類實(shí)現(xiàn)。其中,buildPart方法是零件的配置,設(shè)置一個(gè)不同零件,或者不同的裝配順序就可能產(chǎn)生不同的產(chǎn)品。

public abstract class Builder {

    /**
     * 設(shè)置產(chǎn)品的不同組件/零件,以獲得不同的產(chǎn)品
     */
    public abstract void buildPartA();

    /**
     * 設(shè)置產(chǎn)品的不同組件/零件,以獲得不同的產(chǎn)品
     */
    public abstract void buildPartB();

    /**
     * 建造產(chǎn)品
     * @return
     */
    public abstract Product getProduct();

}
具體建造者

實(shí)現(xiàn)抽象類定義的所有方法,并且返回一個(gè)組建好的對(duì)象

public class ConcreteBuilder1 extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        System.out.println("ConcreteBuilder1->buildPartA()");
        product.setPartA("組件A1");
    }

    @Override
    public void buildPartB() {
        System.out.println("ConcreteBuilder1->buildPartB()");
        product.setPartB("組件B1");
    }

    @Override
    public Product getProduct() {
        System.out.println("ConcreteBuilder1->getProduct()");
        return product;
    }
}
public class ConcreteBuilder2 extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        System.out.println("ConcreteBuilder2->buildPartA()");
        product.setPartA("組件A2");
    }

    @Override
    public void buildPartB() {
        System.out.println("ConcreteBuilder2->buildPartB()");
        product.setPartB("組件B2");
    }

    @Override
    public Product getProduct() {
        System.out.println("ConcreteBuilder2->getProduct()");
        return product;
    }
}
導(dǎo)演類

也叫指揮者類,負(fù)責(zé)安排已有模塊的順序,然后告訴Builder開始建造。導(dǎo)演類起到封裝的作用,避免高層模塊深入到建造者內(nèi)部的實(shí)現(xiàn)類。在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。

public class Director {

    private Builder builder;

    public Director(Builder builder){
        this.builder = builder;
    }

    /**
     * 將部件partA、partB...最后組成復(fù)雜對(duì)象(使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象)
     */
    public void construct(){
        builder.buildPartA();
        builder.buildPartB();
    }
}
客戶端代碼
public class Client {

    public static void main(String[] args) {
        Builder builder1 = new ConcreteBuilder1();
        Director director1 = new Director(builder1);
        director1.construct();
        Product product1 = builder1.getProduct();
        System.out.println(product1);

        Builder builder2 = new ConcreteBuilder2();
        Director director2 = new Director(builder2);
        director2.construct();
        Product product2 = builder2.getProduct();
        System.out.println(product2);
    }
}
優(yōu)點(diǎn)

封裝性

客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)

建造者獨(dú)立,容易擴(kuò)展

便于控制細(xì)節(jié)風(fēng)險(xiǎn)

由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響

使用場(chǎng)景

相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。

多個(gè)部件或零件,都可以裝配到一個(gè)對(duì)象中,但是產(chǎn)生的運(yùn)行結(jié)果又不相同時(shí),則可以使用該模式。

產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能,這個(gè)時(shí)候使用建造者模式非常合適。

在對(duì)象創(chuàng)建過程中會(huì)使用到系統(tǒng)中的一些其他對(duì)象,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過程中不易得到時(shí),也可以采用建造者模式封裝該對(duì)象的創(chuàng)建過程。

該種場(chǎng)景只能是一個(gè)補(bǔ)償方法,因?yàn)橐粋€(gè)對(duì)象不容易獲得,而在設(shè)計(jì)階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計(jì)的最初目標(biāo)。

擴(kuò)展

除上面的通用源碼實(shí)現(xiàn)外,還有另外一種更為常見的場(chǎng)景,就是當(dāng)一個(gè)類構(gòu)造器需要傳入很多參數(shù)時(shí),并且通常有一部分參數(shù)是可選的,如果使用構(gòu)造方法創(chuàng)建這個(gè)類的實(shí)例,代碼可讀性會(huì)非常差,而且很容易引入錯(cuò)誤,此時(shí)就可以利用 builder模式:

public class Person {
    private final String cardId;
    private final String name;
    private final Integer age;
    private final String sex;
    private final String address;

    public static class Builder {
        // 必須的參數(shù)
        private final String cardId;
        private final String name;
        // 可選的參數(shù)
        private Integer age;
        private String sex;
        private String address;

        public Builder(String cardId, String name) {
            this.cardId = cardId;
            this.name = name;
        }

        public Builder age(Integer age) {
            this.age = age;
            return this;
        }

        public Builder sex(String sex) {
            this.sex = sex;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }

    private Person(Builder builder) {
        this.cardId = builder.cardId;
        this.name = builder.name;
        this.age = builder.age;
        this.sex = builder.sex;
        this.address = builder.address;
    }

    @Override
    public String toString() {
        return "cardId:" + cardId + ",name:" + name + ",age:" + age + ",sex:" + sex + ",address:" + address;
    }
}
public class Client {

    public static void main(String[] args) {
        Person zhangsan = new Person.Builder("100000000000000000", "張三")
                .age(28)
                .sex("MALE")
                .address("BJ")
                .build();
        System.out.println(zhangsan);

        Person lisi = new Person.Builder("100000000000000001", "李四")
                .address("TJ")
                .build();
        System.out.println(lisi);
    }
}

上面的代碼通過Person的內(nèi)部類Builder創(chuàng)建一個(gè)Person實(shí)例,其中,李四對(duì)年齡和性別進(jìn)行了”保密“(age和sex均為可選參數(shù))。可以看到,代碼看起來更為優(yōu)雅,大大增強(qiáng)了可讀性,并且客戶端代碼也更容易編寫。

源碼地址:https://gitee.com/tianranll/j...

參考文獻(xiàn):《設(shè)計(jì)模式之禪》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75162.html

相關(guān)文章

  • 設(shè)計(jì)模式建造模式

    摘要:建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來說一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類型 定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細(xì)節(jié)不需要知道 類型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...

    banana_pi 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-建造模式

    摘要:汽車本身就是復(fù)雜產(chǎn)品對(duì)象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構(gòu)造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優(yōu)缺點(diǎn)優(yōu)點(diǎn)降低代碼耦合度。 在未上大學(xué)之前,一直有個(gè)夢(mèng)想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設(shè)計(jì)的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現(xiàn)在沒實(shí)現(xiàn)我的dream,但夢(mèng)想還是得有的。 說到...

    elisa.yang 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式之(三)——建造模式

    摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類創(chuàng)建具體建造者類。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...

    Forelax 評(píng)論0 收藏0
  • #yyds干貨盤點(diǎn)#Java設(shè)計(jì)模式之(三)——建造模式

    1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 說人話:將構(gòu)...

    番茄西紅柿 評(píng)論0 收藏2637
  • 深入理解建造模式 ——組裝復(fù)雜的實(shí)例

    摘要:而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品。最后通過一個(gè)套餐實(shí)例,介紹了建造者模式在實(shí)例中的基本使用手段。 歷史文章回顧: 設(shè)計(jì)模式專欄 深入理解單例模式 深入理解工廠模式 歷史優(yōu)質(zhì)文章推薦: 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論 可能是最漂亮的Spring事務(wù)管理詳解 面試中關(guān)于Java虛擬機(jī)(jvm)的問題看這篇就夠了 無論是在現(xiàn)實(shí)世界中還是在軟件...

    sanyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

txgcwm

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<