Android設(shè)計(jì)模式系列(6)--SDK源碼之享元模式

1.意圖
運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

2.結(jié)構(gòu)


這是一個(gè)完整的享元模式結(jié)構(gòu)圖。
客戶(hù)端通過(guò)享元工廠獲取享元對(duì)象,享元對(duì)象的創(chuàng)建則根據(jù)工廠的享元池來(lái)控制,如果有享元池中沒(méi)有這個(gè)對(duì)象,則創(chuàng)建這個(gè)對(duì)象并保存到享元池中,如果享元池中有這個(gè)對(duì)象,則直接使用這個(gè)對(duì)象。因?yàn)橄碓獙?duì)象在共享的同時(shí),說(shuō)明它重用屬性的不變性,不然都是變化的東西,不存在共享,這些不變得屬性我們稱(chēng)之為內(nèi)部狀態(tài),獨(dú)立與外部場(chǎng)景。而另外一些屬性,可以根據(jù)外部場(chǎng)景變化的,我們稱(chēng)之為外部狀態(tài),在上圖中我們也看到,我們可以通過(guò)Operation改變外部狀態(tài)。
Android中SQLiteCompiledSql的使用,其實(shí)是很多數(shù)據(jù)庫(kù)系統(tǒng)典型的實(shí)現(xiàn)。從應(yīng)用啟動(dòng),通過(guò)各種數(shù)據(jù)庫(kù)操作,我們不知道進(jìn)行了多少次的查詢(xún)操作,而這些操作中又有相當(dāng)一部分sql語(yǔ)句是相同的,這些編譯后的sql編譯對(duì)象其實(shí)是一樣的,是可以共用共享的,其實(shí)就是緩存。SQLiteCompiledSql就是這樣的一個(gè)需要共享的享元對(duì)象,畫(huà)出相關(guān)的UML圖如下:


其中SqliteDatabase中的mCompiledQuerie就是存放享元對(duì)象的容器。
通過(guò)這種方式大大減少了sql編譯對(duì)象的創(chuàng)建,提高了數(shù)據(jù)庫(kù)操作的性能。

3.代碼
享元對(duì)象類(lèi)SQLiteCompiledSql,主要是內(nèi)部狀態(tài)sql語(yǔ)句:

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

享元工廠類(lèi):

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) {
         //省略具體代碼
    }
}

其他類(lèi)幾個(gè)相關(guān)類(lèi)是對(duì)這個(gè)集合的操作相關(guān),和享元模式?jīng)]有什么實(shí)質(zhì)性的關(guān)系,代碼省略。

4.效果
(1).結(jié)構(gòu)型模式;
(2).節(jié)約存儲(chǔ)的方法:用共享減少內(nèi)部狀態(tài)的消耗,用計(jì)算時(shí)間換取對(duì)外部狀態(tài)的存儲(chǔ);
(3).緩沖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容