- 浏览: 1591240 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
享元(FlyWeight)模式,原意是“轻量级”模式,它用来解决大量相同对象被多次实例化,从而导致内存被大量占用的情况。在有的时候我们要多次使用某个类中的公有实例方法,我们通常的做法是,先new一个该类的实例,然后再调用该类的这个方法,调用完毕后这个类也就变成垃圾。这种调用方式如果出现的频率很高,会在对象生成和内存占用上付出很大的代价,享元模式尽可能多地节省对象的生成次数,让多个对象共用一个缓存中的对象。
享元模式中关键要理解“内蕴状态”(Internal State)和“外蕴状态”(External State)这两个概念。
内蕴状态:存储在享元对象内部,不随着环境改变,要以被诸多对象共享。
外蕴状态:一般由客户端指定,并传入享元对象内部,它随着环境进行变化。
举例:
1、QQ好友管理器:管理并显示每一个好友发来的消息。在聊天的过程中,与一个好友之间的通信联系只通过一个享元对象实现消息的发送与接收,而不是每次发送接收消息都生成一个新的对象。
2、网吧管理软件:在网吧管理软件中,客户机软件向服务器软件发出请求(如:举手、上线解屏、下线锁屏......),服务器软件也会向客户机发出指令(如:远程关机,远程监视......),不管客户端与服务器端发生多少次交互,在服务器端每个客户端只保留一个对象实例,服务器与每个客户端之间通信就是通过该对象来实现的。
结构图:
抽象享元(Flyweight):为具体享元规定出需要实现的公共接口。
具体享元(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有“内蕴状态”的话,将“内蕴状态”声明为成员变量,从而使享元对象拥用固定的“内蕴状态”。
享元工厂(FlyweightFactory):负责创建和管理享元角色,保证享元对象可以被共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有符合要求的享元对象。如果已经有了,享元工厂就应当提供这个现有享元对象;如果系统中没有适当的享元对象,享元工厂角色就应当创建一个合适的享元对象。
客户端(Client):维护一个对所有享元对象的引用。提供与管理享元对象的“外蕴状态”。
结构图的示意代码:
//抽象享元
abstract class FlyWeight
{
//传入外蕴状态
public abstract void Operation(string extrinsicState);
//显示内蕴状态和外蕴状态
public abstract void Show();
}
//具体享元A
class ConcreteFlyWeightA : FlyWeight
{
//内蕴状态变量
private string intrinsicState = "FlyWeightA";
//外蕴状态变量
private string extrinsicState ;
public override void Operation(string extrinsicState)
{
this.extrinsicState = extrinsicState;
}
public override void Show()
{
Console.WriteLine(this.intrinsicState+"\t"+this.extrinsicState);
}
}
//具体享元B
class ConcreteFlyWeightB : FlyWeight
{
//内蕴状态变量
private string intrinsicState = "FlyWeightB";
//外蕴状态变量
private string extrinsicState;
public override void Operation(string extrinsicState)
{
this.extrinsicState = extrinsicState;
}
public override void Show()
{
Console.WriteLine(this.intrinsicState + "\t" + this.extrinsicState);
}
}
//享元工厂,管理享元对象
class FlyWeightFactory
{
//保存享元对象
private Hashtable t = new Hashtable();
public FlyWeightFactory()
{
t.Add("A", new ConcreteFlyWeightA());
t.Add("B",new ConcreteFlyWeightB());
}
//根据传入的内蕴状态,构造或返回享元对象,
public FlyWeight GetFlyWeight(string key)
{
if (t.ContainsKey(key))
{
return (FlyWeight)t[key];
}
return null;
}
}
class Class1
{
public static void Main(string[] args)
{
FlyWeightFactory f = new FlyWeightFactory();
//这里会根据传入的关键字A,返回享元对象A
FlyWeight fw1 = f.GetFlyWeight("A");
fw1.Operation("A's Extinsic State");
fw1.Show();
//这里会根据传入的关键字B,返回享元对象B
FlyWeight fw2 = f.GetFlyWeight("B");
fw2.Operation("B's Extinsic State");
fw2.Show();
//这里会根据传入的关键字A,返回享元对象A
FlyWeight fw3 = f.GetFlyWeight("A");
fw3.Operation("Another A's Extinsic State");
fw3.Show();
}
}
享元模式是一种针对大量细粒度对象有效使用的一种模式。Android中的Message、Parcel和TypedArray都利用了享元模式。以Message为例,类图如下:
......
// sometimes we store linked lists of these things
/*package*/ Message next;
private static final Object sPoolSync = new Object();
private static Message sPool;
private static int sPoolSize = 0;
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
sPoolSize--;
return m;
}
}
return new Message();
}
......
public void recycle() {
synchronized (sPoolSync) {
if (sPoolSize < MAX_POOL_SIZE) {
clearForRecycle();
next = sPool;
sPool = this;
sPoolSize++;
}
}
}
......
/*package*/ void clearForRecycle() {
what = 0;
arg1 = 0;
arg2 = 0;
obj = null;
replyTo = null;
when = 0;
target = null;
callback = null;
data = null;
发表评论
-
APN(default、mms、supl、dun、hipri接入点类型的区别)
2013-10-10 19:31 45867设置APN上网时,大家可能经常遇到这个问题:为什么有时要填写 ... -
AMR音频编码器概述及文件格式分析
2013-10-10 19:29 3958全称Adaptive Multi-Rate,自适应多速率编码 ... -
pad 强制加载 Hdpi资源 (2.3 dpi < 240)
2012-07-16 16:47 0pad 强制加载 Hdpi资源 (2.3 dpi < ... -
statusbar 2.3
2011-11-08 16:04 1284以前我的文章分析过Stat ... -
android 输入法默认设置
2011-07-07 14:00 7197设置默认输入法 在 frameworks\base\co ... -
Android Media Scanner Process
2011-06-06 22:58 3410下面是系统图 Medi ... -
handler与多线程消息处理
2011-06-04 13:42 8283在Android下面也有多线程的概念,在C/C++中,子线程可 ... -
android light
2011-03-24 16:15 3414背光设置是在:设置->声音和显示->亮度,通过进度 ... -
PowerManagerService sensor
2011-03-22 20:06 2673默认分类 2010-12-24 14:34:55 阅读144 ... -
android 单例
2011-02-15 09:26 42301. Framework层的代码: A ... -
Android 开发之 Services 服务
2010-11-02 18:21 4244Service Service ... -
深入学习android之AlarmManager
2010-11-01 16:50 34768对应AlarmManage有一个Alarm ... -
eclipse+android+ddms+adt
2010-09-14 10:30 8460用eclipse + ADT作为android ... -
Menus
2010-09-05 19:01 1791Android Menus 文章分类:移动开发 1.O ... -
Android开机自启动应用开发
2010-08-28 10:07 4594目前需要开发一个开机自启动的GTD应用程序来提醒用户的 ... -
Android2.1_Launcher学习笔记
2010-08-11 13:40 3879文章分类:移动开发 好么,2.0的源码没看几天,2.1的 ... -
Browsing Android Source in Eclipse
2010-08-09 16:00 3438Google’s Android SDK includes ... -
android 编译
2010-08-07 16:31 25321 我的系统是Ubuntu 8.04 * 2 系统上 ... -
Ubuntu linux 右键添加"以管理员身份打开","在终端中打开"
2010-08-02 15:04 4662Ubuntu linux 右键添加"以管理员身份打开 ... -
自制android1.5的源码包
2010-08-02 13:44 1903最近打算玩下android,听hong老大说最好看看源码。而a ...
相关推荐
详细讲解了组合模式、观察者模式、单例模式、模板方法模式、备忘录模式、享元模式、命令模式、工厂方法模式、适配器模式 原型模式等10个Android设计模式,和CSDN上其他讲Android设计模式的文章完全不同。讲解详细,...
Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...
享元模式是一种优化资源利用、减少对象创建的设计模式,它在Android开发中也有着广泛的应用。在这个"Android享元模式Demo"中,我们将探讨如何在Android环境中实现享元模式,并通过具体的实例来理解其工作原理。 享...
在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...
"android设计模式"这一主题,主要涵盖了一些常见的设计原则、模式以及如何在Android环境中应用它们。《设计模式之禅》作为一本经典著作,其深入浅出的讲解方式使得读者能够轻松掌握设计模式的核心理念。 1. **设计...
### Java和Android源码设计模式解析 #### 前言:设计模式的重要性 设计模式是软件工程中的一个重要概念,它代表了一种最佳实践,能够帮助开发者解决常见的编程问题。掌握设计模式不仅能够提升代码的质量,还能提高...
本主题将探讨如何利用Kotlin实现常见的设计模式,这些模式对于构建可维护、可扩展和灵活的Android应用程序至关重要。 1. **单例模式(Singleton)**:在Android中,单例模式常用于创建全局唯一实例,例如网络请求管理...
### Java和Android源码设计模式 #### 前言:迈向精通之路——设计模式的重要性 在软件开发领域,设计模式被视为提升代码质量和可维护性的关键工具。本文将深入探讨Java和Android开发中常用的设计模式,并结合实际...
本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...
本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...
本书专门介绍Android源代码的设计模式,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...
在Android开发中,设计模式和设计原则是提升代码质量、可维护性和可扩展性的重要工具。以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single ...
本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...
此外,书中可能还会涉及其他设计模式,如享元模式、命令模式等,并提供实战案例,帮助读者将理论知识转化为实践技能。 通过学习这本书,读者不仅可以掌握设计模式的精髓,还能了解到Android系统架构的深层次设计...
"Android设计模式面试专题" Android 设计模式是一种软件设计模式,旨在帮助开发者编写更加灵活、可维护、可扩展的代码。设计模式的核心思想是将软件系统中变化的部分和不变的部分分离,实现松耦合、提高代码的可...
### Java和Android设计模式 #### 设计模式概览 设计模式是软件开发中解决常见问题的一种标准化解决方案。在Java及Android开发中,合理运用设计模式能够显著提高代码质量,增强程序的灵活性、可扩展性和可维护性。...
此外,书中还可能涉及其他如职责链模式、命令模式、享元模式等设计模式在Android框架和应用开发中的实际运用。通过阅读这本书,开发者不仅能学习到设计模式的理论知识,还能了解到如何在实际项目中有效运用这些模式...
《中文版_源码设计模式解析与实战.pdf》是一本专为Android开发者设计的进阶书籍,它深入探讨了设计模式在实际开发中的应用,并结合Android的源码进行了详细的解析。这本书不仅涵盖了基础的设计模式概念,还通过丰富...
Android设计模式是面向对象编程在Android开发中的应用,它源于《设计模式:可复用面向对象软件的基础》一书中的理论,并在Android SDK源码中得到了广泛应用。设计模式是为了解决软件工程中常见问题而提出的成熟解决...