关闭

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

标签: java23设计模式stringclassinterfaceobject
709人阅读 评论(0) 收藏 举报
分类:

 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将大大的节省了空间。

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:60538次
    • 积分:881
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:11篇
    • 译文:0篇
    • 评论:1条
    文章分类