Android 的Builder模式

Builder的介紹:

Builder模式是 一步一步創(chuàng)建一個(gè)復(fù)雜對(duì)象的創(chuàng)建型模式,它允許用戶在不知道內(nèi)部構(gòu)建細(xì)節(jié)的情況下木蹬,可以更精細(xì)地控制對(duì)象的構(gòu)造流程进泼。該模式是為了將構(gòu)建復(fù)雜對(duì)象的過程和它的部件解耦撵儿,使得構(gòu)建過程和部件的表示隔離開來渤闷。

Builder模式的定義:

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

對(duì)于android中 有個(gè)AlertDialog.Builder的使用想必大家都知道怎么用,這就是使用Builder來構(gòu)建復(fù)雜的AlertDialog對(duì)象安皱。例如下面的代碼

 //顯示基本的AlertDialog  
    private void showDialog(Context context) {  
        AlertDialog.Builder builder = new AlertDialog.Builder(context);  
        builder.setIcon(R.drawable.icon);  
        builder.setTitle("Title");  
        builder.setMessage("Message");  
        builder.setPositiveButton("Button1",  
                new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int whichButton) {  
                        setTitle("點(diǎn)擊了對(duì)話框上的Button1");  
                    }  
                });  
        builder.setNeutralButton("Button2",  
                new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int whichButton) {  
                        setTitle("點(diǎn)擊了對(duì)話框上的Button2");  
                    }  
                });  
        builder.setNegativeButton("Button3",  
                new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int whichButton) {  
                        setTitle("點(diǎn)擊了對(duì)話框上的Button3");  
                    }  
                });  
        builder.create().show();  // 構(gòu)建AlertDialog调鬓, 并且顯示
    }

創(chuàng)建完之后的對(duì)話框效果如圖:


1.png

Builder模式的好處就是
1,良好的封裝性酌伊, 使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié);
2缀踪,建造者獨(dú)立居砖,容易擴(kuò)展;
3驴娃,在對(duì)象創(chuàng)建過程中會(huì)使用到系統(tǒng)中的一些其它對(duì)象奏候,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過程中不易得到。
從代碼的結(jié)構(gòu)上也是看起來很順眼唇敞。

但是

所以 Builder模式的使用場(chǎng)景蔗草,一般如下:
1,相同的方法疆柔,不同的執(zhí)行順序咒精,產(chǎn)生不同的事件結(jié)果時(shí);
2旷档,多個(gè)部件或零件模叙,都可以裝配到一個(gè)對(duì)象中,但是產(chǎn)生的運(yùn)行結(jié)果又不相同時(shí)鞋屈;
3范咨,產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能厂庇,這個(gè)時(shí)候使用建造者模式非常合適渠啊;
4,當(dāng)初始化一個(gè)對(duì)象特別復(fù)雜权旷,如參數(shù)多替蛉,且很多參數(shù)都具有默認(rèn)值時(shí)。

下面以組裝電腦為例來演示一下簡單且經(jīng)典的builder模式。

package com.sx.test.builder;

/**
 * Computer產(chǎn)品抽象類, 為了例子簡單, 只列出這幾個(gè)屬性
 *
 * @author mrsimple
 */
public abstract class Computer {

    protected int mCpuCore = 1;
    protected int mRamSize = 0;
    protected String mOs = "Dos";

    protected Computer() {

    }

    // 設(shè)置CPU核心數(shù)
    public abstract void setCPU(int core);

    // 設(shè)置內(nèi)存
    public abstract void setRAM(int gb);

    // 設(shè)置操作系統(tǒng)
    public abstract void setOs(String os);

    @Override
    public String toString() {
        return "Computer [mCpuCore=" + mCpuCore + ", mRamSize=" + mRamSize + ", mOs=" + mOs + "]";
    }

}
package com.sx.test.builder;

/**
 * Apple電腦
 */
public class AppleComputer extends Computer {

    protected AppleComputer() {

    }

    @Override
    public void setCPU(int core) {
        mCpuCore = core;
    }

    @Override
    public void setRAM(int gb) {
        mRamSize = gb;
    }

    @Override
    public void setOs(String os) {
        mOs = os;
    }

}
package com.sx.test.builder;

/**
 * builder抽象類
 *
 */
public abstract class Builder {
    // 設(shè)置CPU核心數(shù)
    public abstract void buildCPU(int core);

    // 設(shè)置內(nèi)存
    public abstract void buildRAM(int gb);

    // 設(shè)置操作系統(tǒng)
    public abstract void buildOs(String os);

    // 創(chuàng)建Computer
    public abstract Computer create();

}
package com.sx.test.builder;

public class ApplePCBuilder extends Builder {
    private Computer mApplePc = new AppleComputer();

    @Override
    public void buildCPU(int core) {
        mApplePc.setCPU(core);
    }

    @Override
    public void buildRAM(int gb) {
        mApplePc.setRAM(gb);
    }

    @Override
    public void buildOs(String os) {
        mApplePc.setOs(os);
    }

    @Override
    public Computer create() {
        return mApplePc;
    }

}
package com.sx.test.builder;

public class Director {

    Builder mBuilder = null;

    /**
     *
     * @param builder
     */
    public Director(Builder builder) {
        mBuilder = builder;
    }

    /**
     * 構(gòu)建對(duì)象
     *
     * @param cpu
     * @param ram
     * @param os
     */
    public void construct(int cpu, int ram, String os) {
        mBuilder.buildCPU(cpu);
        mBuilder.buildRAM(ram);
        mBuilder.buildOs(os);
    }
}
package com.sx.test.builder;

public class Test {

    public static void main(String[] args) {
        // 構(gòu)建器
        Builder builder = new ApplePCBuilder();
        // Director
        Director pcDirector = new Director(builder);
        // 封裝構(gòu)建過程, 4核, 內(nèi)存2GB, Mac系統(tǒng)
        pcDirector.construct(4, 2, "Mac OS X 10.9.1");
        // 構(gòu)建電腦, 輸出相關(guān)信息
        System.out.println("Computer Info : " + builder.create().toString());
    }
}

結(jié)果輸出:Computer info : Computer [mCpuCore=4, mRamSize=2, mOs=Mac OS X 10.9.1]
上述示例中灭返,通過具體的ApplePCBuilder來構(gòu)建AppleComputer對(duì)象盗迟,而Director封裝了構(gòu)建復(fù)雜產(chǎn)品對(duì)象的過程,對(duì)外隱藏構(gòu)建細(xì)節(jié)熙含。Builder與Director一起將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離罚缕,使得同樣的構(gòu)建過程可以創(chuàng)建不同的對(duì)象。
不過在現(xiàn)實(shí)開發(fā)中怎静,Director角色經(jīng)常會(huì)被省略邮弹。而直接使用一個(gè)Builder來進(jìn)行對(duì)象的封裝,這個(gè)Builder通常為鏈?zhǔn)秸{(diào)用蚓聘,他的關(guān)鍵點(diǎn)是每個(gè)setter方法都返回自身腌乡,也就是return this,這樣使得setter方法可以鏈?zhǔn)秸{(diào)用夜牡,代碼大致如下:
new TestBuilder().setA("A").setB("B").create();
通過這種形式不僅去除了Director角色与纽,整個(gè)結(jié)構(gòu)也更加簡單,也能對(duì)Product對(duì)象的組裝過程有更精細(xì)的控制塘装。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末急迂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹦肴,更是在濱河造成了極大的恐慌僚碎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阴幌,死亡現(xiàn)場(chǎng)離奇詭異勺阐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矛双,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門渊抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人背零,你說我怎么就攤上這事腰吟。” “怎么了徙瓶?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵毛雇,是天一觀的道長。 經(jīng)常有香客問我侦镇,道長灵疮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任壳繁,我火速辦了婚禮震捣,結(jié)果婚禮上荔棉,老公的妹妹穿的比我還像新娘。我一直安慰自己蒿赢,他們只是感情好润樱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羡棵,像睡著了一般壹若。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皂冰,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天店展,我揣著相機(jī)與錄音,去河邊找鬼秃流。 笑死赂蕴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舶胀。 我是一名探鬼主播概说,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嚣伐!你這毒婦竟也來了席怪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤纤控,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碉纺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體船万,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年骨田,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耿导。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡态贤,死狀恐怖舱呻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悠汽,我是刑警寧澤箱吕,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柿冲,受9級(jí)特大地震影響茬高,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜假抄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一怎栽、第九天 我趴在偏房一處隱蔽的房頂上張望丽猬。 院中可真熱鬧,春花似錦熏瞄、人聲如沸脚祟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽由桌。三九已至,卻和暖如春胡陪,著一層夾襖步出監(jiān)牢的瞬間沥寥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工柠座, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑雅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓妈经,卻偏偏與公主長得像淮野,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吹泡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容