享元模式,给我的感觉就是对象池,缓存单例对象。
java中的享元模式最经典的例子就是String类了,还有一个最容易理解的就是word文档字符共享的例子,也是享元模式的经典应用。
本文对android中的sql编译类SQLiteCompiledSql说明,展开分析,也是很容易理解的一个例子,其实,android SDK中必然有很多地方需要用到享元模式。
享元模式,Flyweight Pattern,说的严重点,一些程序如果不使用享元模式的话,根本不能使用面向对象的方法实现,对象会多的撑爆你的内存:"用面向对象思想设计的应用常常会面临对象实例过多的问题"。
如有更多问题想更多讨论此类话题,请加我的群 182503495 攻城狮工会
1.意图
运用共享技术有效地支持大量细粒度的对象。
热门词汇:共享 池 缓存 内部状态 外部状态 对象 单例
2.结构
这是一个完整的享元模式结构图。
客户端通过享元工厂获取享元对象,享元对象的创建则根据工厂的享元池来控制,如果有享元池中没有这个对象,则创建这个对象并保存到享元池中,如果享元池中有这个对象,则直接使用这个对象。因为享元对象在共享的同时,说明它重用属性的不变性,不然都是变化的东西,不存在共享,这些不变得属性我们称之为内部状态,独立与外部场景。而另外一些属性,可以根据外部场景变化的,我们称之为外部状态,在上图中我们也看到,我们可以通过Operation改变外部状态。
Android中SQLiteCompiledSql的使用,其实是很多数据库系统典型的实现。从应用启动,通过各种数据库操作,我们不知道进行了多少次的查询操作,而这些操作中又有相当一部分sql语句是相同的,这些编译后的sql编译对象其实是一样的,是可以共用共享的,其实就是缓存。SQLiteCompiledSql就是这样的一个需要共享的享元对象,画出相关的UML图如下:
其中SqliteDatabase中的mCompiledQuerie就是存放享元对象的容器。
通过这种方式大大减少了sql编译对象的创建,提高了数据库操作的性能。
3.代码
享元对象类SQLiteCompiledSql,主要是内部状态sql语句:
1
2
3
4
5
|
class SQLiteCompiledSql {
private String mSqlStmt = null ;
native_compile(sql);
native_finalize();
} |
享元工厂类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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设计模式系列(2)--SDK源码之观察者模式.pdf
本篇文章介绍了,基于Android设计模式之--SDK源码之策略模式的详解。需要的朋友参考下
策略模式其实特别简单(听到这句话,...下面,我们分析Android中的动画是如何使用策略模式的。 1. 意图定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换。策略模式使得算法可独立于使用它的客户而变化
Google Android SDK开发范例大全(完整版) 包含部分书中源码 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 ...
本项目是PHPHub 社区非官方 Android 客户端, App UI 风格遵循了 Google Material Design 设计风格, 项目架构使用了 MVP 模式, 数据处理使用了 RxJava Retrofit 技术。 项目特点: 界面设计遵循 Google 设计规范 ...
第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发...
适用于Android的Alan语音助手SDK • •••• 快速向您的应用添加语音。 创建语音助手或使用两种输入模式(语音和手势)同步工作来构建多模式界面。艾伦(Alan)是语音AI平台Alan是一个对话式语音AI平台,可让您为您...
android源码中包含了大量的设计模式, 除此以外, android sdk还精心为我们设计了各种helper类, 对于和我一样渴望水平得到进阶的人来说, 都太值得一读了。 这不, 前几天为了了解android的消息处理机制, 我看 了...
第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户...
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
在源码方面,该系统使用了MVC架构模式,将用户界面层(UI)与业务逻辑层(BLL)分离开来。其中,用户界面层使用了Android自带的XML布局编辑器进行设计,而业务逻辑层则使用了Java语言编写的Service类进行处理。此外,该...
该项目通过分析Android系统中的设计模式来提升大家对设计模式的理解,从内核的角度来剖析既增加了对Android系统本身的了解,也从优秀的设计中领悟模式的实际运用以及它适用的场景,避免在实际开发中的生搬硬套。...
Android期末设计报告 Android期末设计报告全文共9页,当前为第1页。Android期末设计报告全文共9页,当前为第1页。教学单位 计算机学院 Android期末设计报告全文共9页,当前为第1页。 Android期末设计报告全文共9页,...
因为时间比较紧张,8 天的时间完成 环信客服模块 的接入,就直接用了环信提供的 UI 控件,但是一些细节的部分, UI 还是会给出设计图,按照设计图完成最终效果。 UI那边直接让我参考 IOS的实现效果: 最终效果 源码...
基于DCT算法的水印嵌入和提取的移动智能终端数字图像证据系统Android APP源码(水印载体形式包括二维码和图片两种,在简易模式下,水印信息仅包括IMEI;水印信息包括地点、时间、IMEI、Android ID).zip # ...
采用 MVP 设计模式,充分解耦,在代码阅读、后期维护上有很好的体验 由于新浪暂停对第三方微博的审核,所以未能通过应用审核,获取更多权限,来完成后续开发,当然也是不能直接运行的 所以想要运行项目的同学,可以...
Android使用基本的MVC模式,尽可能的写得简单,因为主要还是学习后端,后端使用流行的SpringBoot+Mybatis框架,设计一个可扩展分布式架构。 storeClient安卓端 技术 说明 okgo 优秀的网络请求框架 autosize 屏幕适配...
SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。 从Futurice公司Android开发者中学到的经验。 遵循以下准则,避免重复发明轮子。 一个定期翻译国外Android优质的技术、开源库、软件...
万普Android最新SDK1.8.4出炉了!!新增“开屏、退屏、抽屉广告”,广告模式更加丰富。 同时插屏广告增加嵌入式Layout接口,并开放了源码,开发者可根据自身需求进行设计调整。 本次更新并对系统内核进行了优化,...
安卓java读取网页源码 ImageUtil 基于OpenCVAndroid图像处理工具软件。本项目采用Android Studio开发安卓APP,使用C++(OpenCV)编写图片处理算法。主要处理图片的对比度,饱和度以及对图片进行一定程度的清晰度增强...