- 浏览: 832941 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
一、Flyweight模式的意图:
缓存(共享)可以共同的对象、属性,避免创建大量的重复对象、内容。
二、Flyweight模式的特点:
为重复或可共享的对象、属性设置一个缓冲,称为内部属性。这些内部属性一般情况下都是不可修改的,也就是在第一个对象、属性被创建后,就不会去修改了(否则就没意义了)。
除了共享对象、属性之外,还有一些是基于应用环境,或是实时数据,这些无法共享的东西我们称为外部状态。
在Flyweight模式应用中,通常修改的是外部状态属性,而内部状态属性一般都是用于参考或计算时引用。
三、Flyweight模式的构成:
Flyweight模式一般由几个部分组成:
·Flyweight接口(抽象类) :定义了一个可共享的元类
·Flyweight实现类:实现了元类中的操作,而且可能会提供一个用于保存内部状态(共享属性)的空间
·Flyweight Factory:创建Flyweight的工厂类,创建后将其保存到Flyweight
Pool中
·Flyweight
Pool:缓冲Flyweight对象的池,通常包含在工厂类中
四、Flyweight模式的重点:
package flyweight; import java.util.Hashtable; /** ************************************* * @Title FlyweightFactory.java * @Author 张作强 * @Date 2010-8-21 * @Comment 享元工厂(FlyweightFactory)角色 * 本角色负责创建和管理享元角色。 * 本角色必须保证享元对象可以被系统适当地共享。 * 当一个客户端对象调用一个享元对象的时候, * 享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。 * 如果已经有了,享元工厂角色就应当提供这个已有的享元对象; * 如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。 ************************************* */ public class FlyweightFactory { private Hashtable<String, Flyweight> flyweights = new Hashtable<String, Flyweight>(); public void addFlyweight(String s , Flyweight f) { flyweights.put(s, f); } public Flyweight getFlyweight(String key){ Flyweight flyweight = (Flyweight)flyweights.get(key); if(flyweight == null){ flyweight = new ConcreteFlyweight(); flyweights.put(key, flyweight); } return flyweight; } public int getFlyweightFactorySize(){ return flyweights.size(); } }
示例代码如下:
package flyweight; import java.util.Hashtable; /** ************************************* * @Title FlyweightFactory.java * @Author 张作强 * @Date 2010-8-21 * @Comment 享元工厂(FlyweightFactory)角色 * 本角色负责创建和管理享元角色。 * 本角色必须保证享元对象可以被系统适当地共享。 * 当一个客户端对象调用一个享元对象的时候, * 享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。 * 如果已经有了,享元工厂角色就应当提供这个已有的享元对象; * 如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。 ************************************* */ public class FlyweightFactory { private Hashtable<String, Flyweight> flyweights = new Hashtable<String, Flyweight>(); public void addFlyweight(String s , Flyweight f) { flyweights.put(s, f); } public Flyweight getFlyweight(String key){ Flyweight flyweight = (Flyweight)flyweights.get(key); if(flyweight == null){ flyweight = new ConcreteFlyweight(); flyweights.put(key, flyweight); } return flyweight; } public int getFlyweightFactorySize(){ return flyweights.size(); } }
package flyweight; /** ************************************* * @Title Flyweight.java * @Author 张作强 * @Date 2010-8-21 * @Comment 抽象享元(Flyweight)角色 * 此角色是所有的具体享元类的超类, * 为这些类规定出需要实现的公共接口。 * 那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。 ************************************* */ public abstract class Flyweight { public abstract void Operation(int extrinsicState); }
package flyweight; /** ************************************* * @Title ConcreteFlyweight.java * @Author 张作强 * @Date 2010-8-21 * @Comment 具体享元(ConcreteFlyweight)角色 * 实现抽象享元角色所规定的接口。 * 如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。 * 享元对象的内蕴状态必须与对象所处的周围环境无关, * 从而使得享元对象可以在系统内共享的。 ************************************* */ public class ConcreteFlyweight extends Flyweight { private String intrinsicState = "A"; @Override public void Operation(int extrinsicState) { System.out.println("ConcreteFlyweight: intrinsicstate : " + intrinsicState + " , extrinsicstate : " + extrinsicState); } }
package flyweight; /** ************************************* * @Title Client.java * @Author 张作强 * @Date 2010-8-21 * @Comment 客户端(Client)角色 * 本角色需要维护一个对所有享元对象的引用。 * 本角色需要自行存储所有享元对象的外蕴状态。 ************************************* */ public class Client { public static void main(String[] args) { int extrinsicState = 22; FlyweightFactory f = new FlyweightFactory(); f.addFlyweight("X", new ConcreteFlyweight()); f.addFlyweight("Y", new ConcreteFlyweight()); // f.addFlyweight("Z", new ConcreteFlyweight()); Flyweight fx = f.getFlyweight("X"); fx.Operation(extrinsicState); Flyweight fy = f.getFlyweight("Y"); fy.Operation(extrinsicState); // 当一个客户端对象调用一个享元对象的时候, // 享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。 // 如果已经有了,享元工厂角色就应当提供这个已有的享元对象; // 如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。 Flyweight fz = f.getFlyweight("Z"); fz.Operation(extrinsicState); System.out.println("FlyweightFactorySize : " + f.getFlyweightFactorySize()); } }
评论
1 楼
csdn_zuoqiang
2010-08-21
Flyweight模式在XML等数据源中应用
我们上面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料.
每个CD有三个字段:
1.出片日期(year)
2.歌唱者姓名等信息(artist)
3.唱片曲目 (title)
其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期 不同曲目的CD.我们将"歌唱者姓名"作为可共享的ConcreteFlyweight.其他两个字段作为UnsharedConcreteFlyweight.
下面是接口的具体实现(ConcreteFlyweight) ,并为内部状态增加内存空间, ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部(intrinsic),也就是说,ConcreteFlyweight必须和它的应用环境场合无关.
public class ConcreteFlyweight implements Flyweight {
private IntrinsicState state;
public void operation( ExtrinsicState state )
{
//具体操作
}
}
当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:
public class UnsharedConcreteFlyweight implements Flyweight {
public void operation( ExtrinsicState state ) { }
}
我们上面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料.
每个CD有三个字段:
1.出片日期(year)
2.歌唱者姓名等信息(artist)
3.唱片曲目 (title)
其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期 不同曲目的CD.我们将"歌唱者姓名"作为可共享的ConcreteFlyweight.其他两个字段作为UnsharedConcreteFlyweight.
下面是接口的具体实现(ConcreteFlyweight) ,并为内部状态增加内存空间, ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部(intrinsic),也就是说,ConcreteFlyweight必须和它的应用环境场合无关.
public class ConcreteFlyweight implements Flyweight {
private IntrinsicState state;
public void operation( ExtrinsicState state )
{
//具体操作
}
}
当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:
public class UnsharedConcreteFlyweight implements Flyweight {
public void operation( ExtrinsicState state ) { }
}
发表评论
-
微信JS
2013-10-26 21:17 2049<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1495首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 949public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 936java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1081package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6812Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1593Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4481/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26240.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14321、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 2982public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1736package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1280今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4715package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 870package com.retrieve.utils; ... -
两个工具类
2012-03-17 21:27 0package com.retrieve.utils; ... -
mysql、sqlserver、oracle分页,java分页统一接口实现
2012-03-13 17:56 0定义: pageStart 起始页,pageEnd 终止页, ... -
Invalid command: InetLoad::load
2012-03-06 16:41 1291Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1162In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 780自定义JList。
相关推荐
软件模式之Flyweight模式.docx
软件模式之Flyweight模式.doc
23种设计模式之十(结构型模式)Flyweight模式
6共享元模式(Flyweight) 用意:以共享的方式高效地支持大量的细粒度对象
设计模式 Flyweight
什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。 举例说明 一般的...
主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下
使用Flyweight模式的AngularJS 一个示例,展示了如何使用AngularJS 1.4实现Flyweight模式 本地运行 确保已安装 $ git clone https://github.com/iranreyes/angular-flyweight.git # or clone your own fork $ cd ...
2.5 Flyweight模式 2.6 Facade模式 2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 3.4 Observer模式 3.5 Memento模式 3.6 Mediator模式 3.7 Command模式 3.8 Visitor模式 ...
Design Pattern: Flyweight 模式 46 Design Pattern: Proxy 模式(一) 48 Design Pattern: Proxy 模式(二) 49 Design Pattern: Chain of Responsibility 模式 53 Design Pattern: Command 模式 59 Design Pattern...
设计模式中的Flyweight模式,VC源码Flyweight.rar,希望我能把23个模式写全,O(∩_∩)O~
主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考下
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
6.2.7 享元模式(flyweight模式) 6.3 行为模式 6.3.1 策略模式(strategy模式) 6.3.2 模板模式(template method模式) 6.3.3 责任链模式(chain of responsibility模式) 6.3.4 观察者模式(observer模式)...
Flyweight模式先说这名字,fly呢,就是苍蝇,没错这里面不是飞的意思,是苍蝇的意思,weight大家都知道,就是重量,苍蝇的重量,就是非常非常轻的意思。所以Flyweight模式就是处理非常非常轻量级对象的一个东西。...
2.5 Flyweight模式 ..................................................................................................................58 2.6 Facade模式 .....................................................
2.5 Flyweight模式............................44 2.6 Facade模式.................................49 2.7 Proxy模式...................................52 3 行为模式.........................................
2.5 Flyweight模式.......................................... 2.6 Facade模式............................................... 2.7 Proxy模式................................................. 3 行为模式........