設(shè)計模式之享元模式

應(yīng)用場景

享元模式指的是在項目中使用對象池. 可避免頻繁的去創(chuàng)建某個類的對象童本, 大大減少創(chuàng)建的對象细诸, 降低進(jìn)程對內(nèi)存的占用.
最典型的場景是Android中的Message類, 一般情況下, app會頻繁的大量使用Message對象油昂, 如果每次都去new一個新對象出來使用, 用后再通過GC進(jìn)行垃圾回收. 那很可能會導(dǎo)致頻繁的gc,影響程序的性能.
因此, android提供了一個Message對象池, 當(dāng)開發(fā)者需要一個Message對象時, 調(diào)用Message.obtain()從這個池子里取一個對象出來使用, 這樣做可以優(yōu)化一定的性能.

當(dāng)要得到一個對象時, 推薦使用

Message msg = Message.obtain();

獲得一個Message對象.
而不要每次都

Message msg = new Message();

這樣去創(chuàng)建一個新的Message對象去使用.

Message的代碼分析

Message的對象池是通過一個鏈表實(shí)現(xiàn)的.
默認(rèn)最大長度是50冕碟,
從鏈表中取對象時拦惋,取的是頭節(jié)點(diǎn).
把不用的對象添加進(jìn)鏈表, 也是作為頭節(jié)點(diǎn)添加到鏈表中.

public final class Message implements Parcelable {
    private static Message sPool; //指向Message對象池鏈表的頭節(jié)點(diǎn)
    Message next; //指向鏈表頭的下一個節(jié)點(diǎn).


    private static final int MAX_POOL_SIZE = 50;

    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) { //如果鏈表存在的話
                Message m = sPool; //取出鏈表的頭節(jié)點(diǎn)對象, 并返回這個頭節(jié)點(diǎn)對象
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }


    public void recycle() {
        recycleUnchecked();
    }

//對某一個不再使用的Message對象進(jìn)行回收.
    void recycleUnchecked() {
        // Mark the message as in use while it remains in the recycled object pool.
        // Clear out all other details.
        flags = FLAG_IN_USE;
        what = 0;
        arg1 = 0;
        arg2 = 0;
        obj = null;
        replyTo = null;
        sendingUid = -1;
        when = 0;
        target = null;
        callback = null;
        data = null;

        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {//鏈表長度小于50個的情況下
                next = sPool;
                sPool = this; //把當(dāng)前要回收的節(jié)點(diǎn)作為鏈表頭添加進(jìn)鏈表
                sPoolSize++;
            }
        }
    }

}

---DONE.---

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末安寺,一起剝皮案震驚了整個濱河市厕妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挑庶,老刑警劉巖言秸,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迎捺,居然都是意外死亡举畸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門凳枝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抄沮,“玉大人,你說我怎么就攤上這事岖瑰∨崖颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵蹋订,是天一觀的道長率挣。 經(jīng)常有香客問我,道長辅辩,這世上最難降的妖魔是什么难礼? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮玫锋,結(jié)果婚禮上蛾茉,老公的妹妹穿的比我還像新娘。我一直安慰自己撩鹿,他們只是感情好谦炬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著节沦,像睡著了一般键思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甫贯,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天吼鳞,我揣著相機(jī)與錄音,去河邊找鬼叫搁。 笑死赔桌,一個胖子當(dāng)著我的面吹牛供炎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疾党,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼音诫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雪位?” 一聲冷哼從身側(cè)響起竭钝,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雹洗,沒想到半個月后香罐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡时肿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年穴吹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗜侮。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啥容,靈堂內(nèi)的尸體忽然破棺而出锈颗,到底是詐尸還是另有隱情,我是刑警寧澤咪惠,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布击吱,位于F島的核電站,受9級特大地震影響遥昧,放射性物質(zhì)發(fā)生泄漏覆醇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一炭臭、第九天 我趴在偏房一處隱蔽的房頂上張望永脓。 院中可真熱鬧,春花似錦鞋仍、人聲如沸常摧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落午。三九已至,卻和暖如春肚豺,著一層夾襖步出監(jiān)牢的瞬間溃斋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工吸申, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梗劫,地道東北人享甸。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像在跳,于是被迫代替她去往敵國和親枪萄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 享元模式 由于對象創(chuàng)建的開銷猫妙,面向?qū)ο蟮南到y(tǒng)可能會面臨性能問題瓷翻。性能問題通常在資源受限的嵌入式系統(tǒng)中出現(xiàn),比如智能...
    英武閱讀 1,800評論 0 50
  • 引入享元模式 享元模式的實(shí)例 享元模式的分析 引入享元模式 flyweight是輕量級的意思割坠,指的是拳擊比賽中選手...
    六尺帳篷閱讀 686評論 0 2
  • 她這樣說齐帚,我們可不會真的動氣,現(xiàn)在要的是心平氣和彼哼。鎮(zhèn)定对妄,冷靜,對付她敢朱。 她不同于之前的任何人剪菱。她給我們的壓力,大過...
    浮生萬夢星耀燭天閱讀 1,615評論 0 1
  • 文 | 正一 2017 要投入 在即興劇中拴签,除了game之外的所有點(diǎn)都應(yīng)演得真實(shí)可信孝常。如你把其他點(diǎn)都做得極好,唯獨(dú)...
    盧正一閱讀 762評論 0 2