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

資訊專欄INFORMATION COLUMN

建造者(Builder)模式 的若干使用場景

abson / 3813人閱讀

摘要:建造的過程在指揮者這里完成,用戶就不需要知道了客戶端代碼場景二遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器。重疊構(gòu)造器模式可行,但是當(dāng)有許多參數(shù)的時(shí)候,客戶端代碼會(huì)很難編寫,并且仍然難以閱讀。

1.場景一

如果我們需要將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示的意圖時(shí),我們可以使用 Builder模式,又叫生成器模式。如果我們用了Builder模式,那么用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細(xì)節(jié)就不需要知道了。
比如現(xiàn)在我們有一個(gè)這樣的使用場景,需要在屏幕上畫小人,人要有頭手腳,要畫不同的人,胖的小人,瘦的小人,矮的小人。按照通常的寫法,會(huì)有很多的樣板代碼,畫人的頭,畫人腳手,如果一不小心,非常容易缺胳膊少腿。
下面我們演示Builder模式的實(shí)現(xiàn):

public class Person {
    //限于篇幅get和set方法此處省略
    Head head;
    Body body;
    Arm leftArm;
    Arm rightArm;
    Leg leftLeg;
    Leg rightLeg;
    
    public void drawHead(int size){...}
    public void drawBody(int size){...}
    public void drawLeftArm(int size){...}
    public void drawRightArm(int size){...}
    public void drawLeftLeg(int size){...}
    public void drawRightLeg(int size){...}
}

abstract class BuilderPerson {
    protected Person person = new Person();
    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildLeftArm();
    public abstract void buildRightArm();
    public abstract void buildLeftLeg();
    public abstract void buildRightLeg();
}

public class BuilderThinPerson extends BuilderPerson{
    
    @Override
    public void buildHead() {
        person.drawHead(10);
    }
    
    @Override
    public void buildBody() {
        person.drawBody(10);   //畫胖小人只需將這邊的數(shù)值修改,
                               // 再生成一個(gè)類即可
    }
    
    @Override
    public void buildLeftArm() {
        person.drawLeftArm(5);
    }
    
    @Override
    public void buildRightArm() {
        person.drawRightArm(5);
    }
    
    @Override
    public void buildLeftLeg() {
        person.drawLeftLeg(7);
    }
    
    @Override
    public void buildRightLeg() {
        person.drawRightLeg(7);
    }
}
我們還缺Builder模式中一個(gè)非常重要的類,指揮者(Director),用它來控制建造過程,也用來隔離用戶與建造過程的關(guān)聯(lián)。
public class PersonDirector{
    private BuilderPerson pb;
    public PersonDirector(BuilderPerson pb){
        this.pb = pb;
    }
    //建造的過程在指揮者這里完成,用戶就不需要知道了
    public void createPerson() {
        pb.buildHead();
        pb.buildBody();
        pb.buildLeftArm();
        pb.buildRightArm();
        pb.buildLeftLeg();
        pb.buildRightLeg();
    }
}
客戶端代碼
BuilderPerson bp = new BuilderThinPerson();
PersonDirector pd = new PersonDirector(bp);
pd.createPerson();

2.場景二

遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器。靜態(tài)工廠和構(gòu)造器有個(gè)共同的局限性:它們都不能很好地?cái)U(kuò)展到大量的可選參數(shù)。
考慮這樣的一個(gè)場景:用一個(gè)類表示包裝食品外面顯示的營養(yǎng)成分標(biāo)簽。這些標(biāo)簽中有幾個(gè)域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過20個(gè)可選域:總脂肪量、飽和脂肪量、轉(zhuǎn)化脂肪、膽固醇、鈉等等。
程序員一向習(xí)慣采用重疊構(gòu)造器模式,在這種模式下,你提供第一個(gè)只有必要參數(shù)的構(gòu)造器,第二個(gè)構(gòu)造器有一個(gè)可選參數(shù),第三個(gè)有兩個(gè)可選參數(shù),以此類推,最后一個(gè)構(gòu)造器包含所有可選參數(shù)。重疊構(gòu)造器模式可行,但是當(dāng)有許多參數(shù)的時(shí)候,客戶端代碼會(huì)很難編寫,并且仍然難以閱讀。一長串類型相同的參數(shù)會(huì)導(dǎo)致一些微妙的錯(cuò)誤。如果客戶端不小心顛倒了其中兩個(gè)參數(shù)的順序,編譯器也不會(huì)出錯(cuò),但是程序在運(yùn)行時(shí)會(huì)出現(xiàn)錯(cuò)誤的行為。
下面是Builder模式的代碼:

public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;
    
    public static class Builder {
        //required parameters
        private final int servingSize;
        private final int servings;
        
        //Optional parameters - initialized to default values
        private int calories;
        private int fat;
        private int sodium;
        private int carbohydrate;
        
        public Builder(int servingSize, int servings){
            this.servingSize = servingSize;
            this.servings = servings
        }
        
        public Builder calories(int val){
            calories = val;
            return this;
        }
        
        public Builder fat(int val){
            fat = val;
            return this;
        }
        
        public Builder sodium(int val) {
            sodium = val;
            return this;
        }
        
        public Builder carbohydrate(int val){
            carbohydrate = val;
            return this;
        }
        
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
    
    private NutritionFacts(Builder builder){
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

NutritionFacts是不可變的。builder的setter方法返回builder本身,以便可以把調(diào)用鏈接起來。下面就是客戶端代碼:

NutritionFacts juice = new NutritionFacts.Builder(240, 8).
    calories(100).sodium(35).carbohydrate(27).build();

這樣的客戶端代碼很容易編寫,更重要的是,易于閱讀。

參考:
1.《大話設(shè)計(jì)模式》
2.《Effective Java 第二版》

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

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

相關(guān)文章

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

    摘要:即建造者模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。指導(dǎo)類負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅斫M建產(chǎn)品,指導(dǎo)類一般不與產(chǎn)品類發(fā)生依賴關(guān)系,與指導(dǎo)類直接交互的是建造者類建造者模式優(yōu)點(diǎn)建造者模式的封裝性很好。 建造者模式 將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。主要解決在軟件系統(tǒng)中,有時(shí)候面臨著一個(gè)復(fù)雜對(duì)象的創(chuàng)建工作,由于需求的變化,這個(gè)復(fù)雜對(duì)象的某些部分經(jīng)常面臨著劇烈的變化...

    tanglijun 評(píng)論0 收藏0
  • 一天一個(gè)設(shè)計(jì)模式之JS實(shí)現(xiàn)——建造模式

    摘要:參考文章設(shè)計(jì)模式之建造者模式一什么是建造者模式建造者模式是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 參考文章:java設(shè)計(jì)模式之建造者模式 一、什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。工廠類模式提供的是創(chuàng)建單個(gè)類的模式,而建造者模式則是將各種產(chǎn)品集中起來進(jìn)行管理,用來創(chuàng)建復(fù)合對(duì)象,所謂...

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

    摘要:在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。該種場景只能是一個(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 same...

    txgcwm 評(píng)論0 收藏0
  • 《源碼中設(shè)計(jì)模式》之建造模式——鏈?zhǔn)秸{(diào)用

    摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動(dòng)力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計(jì)模式。為我們提供了建造者模式的快速實(shí)現(xiàn),要應(yīng)用到實(shí)際編碼中。 ...

    wind3110991 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式系列三:建造模式

    摘要:優(yōu)點(diǎn)建造者模式的封裝性很好,對(duì)象本身與構(gòu)建過程解耦。建造者模式很容易進(jìn)行擴(kuò)展。適用場景需要生成的對(duì)象具有復(fù)雜得內(nèi)部結(jié)構(gòu)且內(nèi)部屬性本身相互依賴建造者模式的代碼實(shí)現(xiàn)建造者模式主要有個(gè)部分產(chǎn)品類建造者類指揮者類客戶。建造者完成相應(yīng)的部分。 建造者模式 建造者模式(builder pattern)比較簡單,它屬于創(chuàng)建型模式的一種,將一個(gè)復(fù)雜的對(duì)象分解成多個(gè)簡單的對(duì)象來進(jìn)行構(gòu)建,將復(fù)雜的構(gòu)建層與...

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

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

0條評(píng)論

abson

|高級(jí)講師

TA的文章

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