編輯:Android開發實例
享元模式,給我的感覺就是對象池,緩存單例對象。
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).緩沖。
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例講述了Android實現多線程下載文件的方法。分享給大家供大家參考。具體如下: 多線程下載大概思路就是通過Range 屬性實現文件分段,然後用Random
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
在這裡我們要使用Android ListView來實現顯示股票行情,效果圖如下,紅色表示股票價格上漲,綠色表示股票價格下跌。 第一步、定義color.xml如下