Android常用的設(shè)計(jì)模式<一>:Builder模式

Builder

設(shè)計(jì)模式是在日常的編程工作中對(duì)一些常見(jiàn)的問(wèn)題場(chǎng)景總結(jié)出來(lái)的最優(yōu)編程套路,通過(guò)這種抽象和總結(jié),可以在遇到類(lèi)似的需求時(shí)快速使用對(duì)應(yīng)的設(shè)計(jì)模式,實(shí)現(xiàn)高效優(yōu)雅的編程。在Android日常開(kāi)發(fā)中,我們也會(huì)經(jīng)常使用一些實(shí)用性強(qiáng),具有代表性的設(shè)計(jì)模式,對(duì)這些設(shè)計(jì)模式進(jìn)行了解和學(xué)習(xí),不僅有助于我們理解Android框架下的代碼,包括一些著名的開(kāi)源代碼的設(shè)計(jì)實(shí)現(xiàn)和使用,更有助于我們?cè)谧约旱木幊坦ぷ髦刑子眠@些模式,完成高質(zhì)量的編程。

本文將結(jié)合實(shí)例介紹其中一種常用的設(shè)計(jì)模式:Builder模式。

Builder模式主要用于復(fù)雜對(duì)象的構(gòu)造,通過(guò)使用Builder模式可以減少構(gòu)造器或方法調(diào)用傳入的參數(shù)數(shù)量。這對(duì)有很多個(gè)配置參數(shù)進(jìn)行初始化的對(duì)象來(lái)說(shuō)尤其適用。

以Android常用的圖片加載顯示工具Picasso為例,進(jìn)行初始化有十幾項(xiàng)可配置參數(shù),如果采用通常的set方法進(jìn)行設(shè)置,代碼看起來(lái)會(huì)是這樣:

Picasso picasso = new Picasso();
picasso.setDefaultBitmapConfig(Bitmap.Config.RGB_565);
picasso.setDownloader(new OkHttpDownloader(FileUtility.getPicassoCacheDir()))            
picasso.setRequestTransformer(new Picasso.RequestTransformer() { ... })       
picasso.setExecutor(executorService)
picasso.setMemoryCache(cache)
picasso.setListener(myListener)
picasso.setIndicatorsEnabled(true)
picasso.setLoggingEnabled(true) 

或者采用多個(gè)參數(shù)的構(gòu)造函數(shù)的方式,像這樣:

Picasso picasso = new Picasso(Bitmap.Config.RGB_565, 
    new OkHttpDownloader(FileUtility.getPicassoCacheDir()),
    new Picasso.RequestTransformer() { ... },
    executorService,
    cache,
    myListener,
    true,
    true);

上面這兩種方式中,第一種set方式會(huì)產(chǎn)生很多重復(fù)的代碼,而且set方法的堆疊使代碼看起來(lái)比較亂;第二種多個(gè)參數(shù)的構(gòu)造函數(shù)的方式在參數(shù)眾多的情況下難以分清某個(gè)位置具體參數(shù)代表的意義,比如最后兩個(gè)boolean類(lèi)型的參數(shù)。而且如果只需要選擇性的初始化其中幾個(gè)變量,則需要添加多個(gè)接受不同參數(shù)的構(gòu)造函數(shù),或者使用這個(gè)構(gòu)造函數(shù),同時(shí)給不需要初始化的參數(shù)傳null,如下,顯然很不利于閱讀。

Picasso picasso = new Picasso(Bitmap.Config.RGB_565, 
    null, 
    new Picasso.RequestTransformer() { ... }, 
    null, 
    null, 
    null, 
    true, 
    true);

使用Builder模式可以?xún)?yōu)雅的解決這個(gè)問(wèn)題。Builder模式包含兩部分,需要構(gòu)造的目標(biāo)類(lèi)和嵌套在該類(lèi)內(nèi)部的Builder類(lèi),通過(guò)兩步操作完成目標(biāo)類(lèi)的構(gòu)造:

  1. 通過(guò)Builder類(lèi)提供一系列函數(shù),接受各種設(shè)置,并存儲(chǔ)在Builder類(lèi)內(nèi)部。
  2. 所有配置都設(shè)置完成后,調(diào)用build函數(shù),利用Builder類(lèi)完成目標(biāo)類(lèi)的構(gòu)造。

具體代碼示例如下:

Picasso picasso = new Picasso.Builder(this)            
                .defaultBitmapConfig(Bitmap.Config.RGB_565)            
                .downloader(new OkHttpDownloader(FileUtility.getPicassoCacheDir()))            
                .requestTransformer(new Picasso.RequestTransformer() { ... })       
                .executor(executorService)
                .memoryCache(cache)
                .listener(myListener)
                .indicatorsEnabled(true)
                .loggingEnabled(true)     
                .build();

這種方式減少了很多重復(fù)的代碼,結(jié)構(gòu)清晰,每個(gè)配置的意義一目了然。我們看一下具體是怎么實(shí)現(xiàn)的,這里為了簡(jiǎn)化我們只選取了三個(gè)參數(shù)做演示,其他參數(shù)類(lèi)似:

public class Picasso {
    final Cache cache;
    boolean indicatorsEnabled;
    boolean loggingEnabled;
    ...
    Picasso(Context context, Cache cache, boolean indicatorsEnabled, boolean loggingEnabled);

    public static class Builder {
        private Cache cache;
        private boolean indicatorsEnabled;
        private boolean loggingEnabled;
        ...
        
        public Picasso.Builder memoryCache(Cache memoryCache) {    
            this.cache = memoryCache;        
            return this;
        }

        public Picasso.Builder indicatorsEnabled(boolean enabled) {    
            this.indicatorsEnabled = enabled;    
            return this;
        }

        public Picasso.Builder loggingEnabled(boolean enabled) {    
            this.loggingEnabled = enabled;    
            return this;
        }

         public Picasso build() {
            return new Picasso(context, this.cache, this.indicatorsEnabled, this.loggingEnabled);
        }
}

可以看出,實(shí)現(xiàn)的原理很簡(jiǎn)單,Builder類(lèi)暫存了外界傳入的參數(shù),然后在build方法中,通過(guò)調(diào)用目標(biāo)類(lèi)的構(gòu)造函數(shù)完成對(duì)象的生成。下次遇到這種多項(xiàng)配置的初始化操作時(shí),你就可以嘗試用這種Builder模式,實(shí)現(xiàn)簡(jiǎn)潔優(yōu)雅的編程。

參考:
http://www.importnew.com/6605.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評(píng)論 6 545
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,795評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,943評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 64,057評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,773評(píng)論 6 414
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,106評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,282評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,793評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,507評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,741評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,929評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,325評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,661評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,482評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,702評(píng)論 2 380

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,836評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,806評(píng)論 25 708