java23种设计模式之共享模式(FlyWeight)

原创 2012年03月23日 14:07:56

 http://www.0755build.com

共享模式(FlyWeight)避免拥有相同内容的小类的开销(如耗费内存),使大家同享一个类(元类)。为什么使用共享模式(FlyWeight)呢?因为面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如字处理软件,如果每个文字都作为一个对象,几千个字就是几千个对象,无疑会耗费内存,所以我们要“求同存异”,找出这些对象群的共同点,设计一个元类。共享模式(Flyweight)有两个重要的概念内部状态intrinsic和外部状态extrinsic,它能提高程序的效率和性能,大大加快程序的运行速度。共享模式(Flyweight)的实现如下:

package yw.flyweight;
//共享池
public interface Flyweight {
 public void operation(ExtrinsicStat state);
}

package yw.flyweight;
//用于本模式的抽象数据类型(根据自己的要求设计)
public interface ExtrinsicStat {

}


package yw.flyweight;

public interface IntrinsicState {

}

package yw.flyweight;
//共享的
public class ConcreateFlyweight implements Flyweight{
 private IntrinsicState state;
 public void operation(ExtrinsicStat state) {
  //具体操作
 }

}

 

package yw.flyweight;
//不共享的
public class UnsharedConcreateFlyweight implements Flyweight{

 public void operation(ExtrinsicStat state) {
  
 }

}

 

package yw.flyweight;

import java.util.Hashtable;

public class FlyweightFactory {
 private Hashtable flyweights=new Hashtable();
 public Flyweight getFlyweight(Object key){
  Flyweight flyweight=(Flyweight)flyweights.get(key);
  if(flyweight==null){
   //产生新的ConcreateFlyweight
   flyweight=new ConcreateFlyweight();
   flyweights.put(key, flyweight); //将该对象加入到共享池总
  }
  return flyweight;
 }
}

 

package yw.flyweight;

public class FlyweightApp {
 public static void main(String args[]){
  FlyweightFactory factory=new FlyweightFactory();
  Flyweight fly1=factory.getFlyweight("Object1");
  Flyweight fly2=factory.getFlyweight("Object2");
  Flyweight fly3=factory.getFlyweight("Object2");
  //当大量的调用Flyweight对象时,肯定有重复调用的情况,所以我们就可以少创建很多对象,直接从共享池中取得该对象
 }
}

使用实例,以CD为例子,我们假设在一个XML文件中,存放多个CD资料,每个CD有三个字段,1:出片日期;2:歌唱者姓名等信息;3:唱片曲目

CD就好比Flyweight

public class CD{

private String title;

private int year;

private Artist artist;

...

}

以Aritist作为共享的ConcreateFlyweight

public class Aritist{

private String name;

public Artist(String n){

name=n;

}

public String getName(){

return name;

}

}

在看看Flyweight factory专门用来制造上面的可共享的ConcreateFlyweight:Artist

public class FlyweightFactory{

Hashtable pool=new Hashtable();

Artist getArtist(String key){

Artist result=(Artist)pool.get(key);

if(result==null){

result=new Artist(key);

pool.put(key,result);

}

return result;

}

}

所以如果有大量的CD,Flyweight将大大的节省了空间。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java并发-独占锁与共享锁

1 锁的独占与共享       java并发包提供的加锁模式分为独占锁和共享锁,独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。共享锁,则允许多个线程同...

24种设计模式大全-牛人详解

Longronglin之设计模式: Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该...
  • MR_ROG
  • MR_ROG
  • 2014-11-24 22:42
  • 7825

java23种设计模式--享元模式(flyweight)

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。         FlyWeightFactory负责创建和管理享元单元,当一个客户...

Java开发中的23种设计模式详解----享元模式(Flyweight)

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时...

Java设计模式(四)Proxy(代理),Flyweight(共享元)

结构模式(二)Proxy(代理)为其他对象提供一种代理以控制对这个对象的访问。代理模式主要分两种:一种是静态代理,代理和被代理对象在代理之前是确定的一种是动态代理,被代理对象在代理之前是未知的在某些情...

java设计模式10:Flyweight

享元模式是对象的结构模式。 享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State). 一个内蕴...

JAVA设计模式:享元(Flyweight)

享元模式以共享的方式高效地支持大量的细粒度对象。         在面向对象的程序设计语言看来,一切事务都被描述成对象(Object)。对象拥有状态(属性)和行为(方法),我们将具有相同行为的对象抽...

java设计模式进阶_flyweight

// // // Generated by StarUML(tm) Java Add-In // // @ Project : Untitled // @ File Name : Potion....

C#设计模式之Flyweight

  • 2008-08-19 12:01
  • 15KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)