Java模式研究袖珍版之Flyweight模式

坐着板凳儿上网

坐着板凳儿上网

2016-02-19 18:40

想要天天向上,就要懂得享受学习。图老师为大家推荐Java模式研究袖珍版之Flyweight模式,精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

  Flyweight定义:
  
  避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
  
  为什么使用?
  
  面向对象语言的原则就是一切都是对象,但是假如真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,假如以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内部状态intrinsic和外部状态extrinsic之分.
  
  
  说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式.Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象.
  
  Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.
  
  如何使用?
  
  我们先从Flyweight抽象接口开始:
  
  程序代码:
   
public interface Flyweight
  {
  public void operation( ExtrinsicState state );
  }
  //用于本模式的抽象数据类型(自行设计)
  public interface ExtrinsicState { }
  下面是接口的具体实现(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 factory负责维护一个Flyweight池(存放内部状态),当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用的,假如有,factory只是简单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象.池
  
  程序代码:
  
  
    public class FlyweightFactory {
  //Flyweight pool
  private Hashtable flyweights = new Hashtable();
  public Flyweight getFlyweight( Object key ) {
  Flyweight flyweight = (Flyweight) flyweights.get(key);
  if( flyweight == null ) {
  //产生新的ConcreteFlyweight
  flyweight = new ConcreteFlyweight();
  flyweights.put( key, flyweight );
  }
  return flyweight;
  }
  }
  至此,Flyweight模式的基本框架已经就绪,我们看看如何调用:
  
  程序代码:
  
    FlyweightFactory factory = new FlyweightFactory();
  Flyweight fly1 = factory.getFlyweight( "Fred" );
  Flyweight fly2 = factory.getFlyweight( "Wilma" );
  ......
  从调用上看,好象是个纯粹的Factory使用,但奥妙就在于Factory的内部设计上.
  
  Flyweight模式在XML等数据源中应用
  
  我们上面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料.
  
  每个CD有三个字段:
  
  1.出片日期(year)
  
  2.歌唱者姓名等信息(artist)
  
  3.唱片曲目 (title)
  
  其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期 不同曲目的CD.我们将"歌唱者姓名"作为可共享的ConcreteFlyweight.其他两个字段作为UnsharedConcreteFlyweight.
  
  首先看看数据源XML文件的内容:
  
  程序代码:
  
展开更多 50%)
分享

猜你喜欢

Java模式研究袖珍版之Flyweight模式

编程语言 网络编程
Java模式研究袖珍版之Flyweight模式

无废话C#设计模式之十:Flyweight

编程语言 网络编程
无废话C#设计模式之十:Flyweight

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java模式设计之数据访问对象模式

编程语言 网络编程
Java模式设计之数据访问对象模式

Java设计模式之计数代理模式

编程语言 网络编程
Java设计模式之计数代理模式

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入浅出Java设计模式之备忘录模式

编程语言 网络编程
深入浅出Java设计模式之备忘录模式

《黑暗之魂2》双挥模式研究心得

黑暗之魂
《黑暗之魂2》双挥模式研究心得

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Windows7系统下有线网络优先级设置

Windows7系统下有线网络优先级设置

在Word2010中打开所有支持的Word文档

在Word2010中打开所有支持的Word文档
下拉加载更多内容 ↓