享元模式,给我的感觉就是对象池,缓存单例对象。
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).缓冲。

更多相关文章

  1. 类和 Json对象
  2. Android(安卓)--- Activity生命周期
  3. Android系统配置数据库注释(settings.db)
  4. Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色
  5. Android(安卓)热点开关状态的判断和获取热点ssid
  6. Android中文API(144) —— JsonWriter
  7. Android之Handler用法总结
  8. android通过ksoap2对webservice的解析
  9. Android的网络状态判断

随机推荐

  1. 在PHP中通过GD库创建简单的图片(图文详解)
  2. 如何将curl获取到的json对象转成数组
  3. php如何修改数组的值?
  4. PHP在图片中用 imagettftext() 添加水印(
  5. 如何解决php中curl传递数据太慢
  6. php如何设置权限?
  7. php代码如何在html文件里面执行(详解)
  8. 如何解决php中curl_init()函数不可用
  9. php中如何进行小写转换?
  10. PHP以正则表达式验证手机号码