Android設計模式系列(6)–SDK源碼之享元模式

來源:互聯網
上載者:User

享元模式,給我的感覺就是對象池,緩衝單例對象。
java中的享元模式最經典的例子就是String類了,還有一個最容易理解的就是word文檔字元共用的例子,也是享元模式的經典應用。
本文對android中的sql編譯類SQLiteCompiledSql說明,展開分析,也是很容易理解的一個例子,其實,android SDK中必然有很多地方需要用到享元模式。
享元模式,Flyweight  Pattern,說的嚴重點,一些程式如果不使用享元模式的話,根本不能使用物件導向的方法實現,對象會多的撐爆你的記憶體:"用物件導向思想設計的應用常常會面臨對象執行個體過多的問題"。 

1.意圖
運用共用技術有效地支援大量細粒度的對象。
熱門詞彙:共用 池 緩衝 內部狀態 外部狀態 對象 單例 

2.結構 


這是一個完整的享元模式結構圖。
用戶端通過享元工廠擷取享元對象,享元對象的建立則根據工廠的享元池來控制,如果有享元池中沒有這個對象,則建立這個對象並儲存到享元池中,如果享元池中有這個對象,則直接使用這個對象。因為享元對象在共用的同時,說明它重用屬性的不變性,不然都是變化的東西,不存在共用,這些不變得屬性我們稱之為內部狀態,獨立與外部情境。而另外一些屬性,可以根據外部情境變化的,我們稱之為外部狀態,在中我們也看到,我們可以通過Operation改變外部狀態。
Android中SQLiteCompiledSql的使用,其實是很多資料庫系統典型的實現。從應用啟動,通過各種資料庫操作,我們不知道進行了多少次的查詢操作,而這些操作中又有相當一部分sql語句是相同的,這些編譯後的sql編譯對象其實是一樣的,是可以共用共用的,其實就是緩衝。SQLiteCompiledSql就是這樣的一個需要共用的享元對象,畫出相關的UML圖如下:


其中SqliteDatabase中的mCompiledQuerie就是存放享元對象的容器。
通過這種方式大大減少了sql編譯對象的建立,提高了資料庫操作的效能。

3.代碼
享元對象類SQLiteCompiledSql,主要是內部狀態sql語句:

class SQLiteCompiledSql {    private String mSqlStmt = null;    native_compile(sql);     native_finalize();}

享元工廠類:

public class SQLiteDatabase{     Map<String, SQLiteCompiledSql> mCompiledQueries = Maps.newHashMap();     SQLiteCompiledSql getCompiledStatementForSql(String sql) {        SQLiteCompiledSql compiledStatement = null;        boolean cacheHit;        synchronized(mCompiledQueries) {            if (mMaxSqlCacheSize == 0) {                return null;            }            cacheHit = (compiledStatement = mCompiledQueries.get(sql)) != null;        }        if (cacheHit) {            mNumCacheHits++;        } else {            mNumCacheMisses++;        }        return compiledStatement;    }    private void deallocCachedSqlStatements() {        synchronized (mCompiledQueries) {            for (SQLiteCompiledSql compiledSql : mCompiledQueries.values()) {                compiledSql.releaseSqlStatement();            }            mCompiledQueries.clear();        }    }    void addToCompiledQueries(String sql, SQLiteCompiledSql compiledStatement) {         //省略具體代碼    }}

  其他類幾個相關類是對這個集合的操作相關,和享元模式沒有什麼實質性的關係,代碼省略。

4.效果
(1).結構型模式;
(2).節約儲存的方法:用共用減少內部狀態的消耗,用計算時間換取對外部狀態的儲存;
(3).緩衝。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.