共同的天空(FlyWeight)

王朝other·作者佚名  2006-01-08
宽屏版  字体: |||超大  

很多情况下.大量的类似之处使得我们不得不为重复的数据使用少的可怜的内存.这样

的情况很糟糕.既然如此.我们必须找到一个好的办法.把那些可能重复的数据统一管理

这样是在合理不过的事情了.好的..我们应该从如下几个方面来考虑.首先要找出对象之

间的共同之处.这部分是可以共享.那么就需要封装到一个类中.那么剩下的不能共享的

就只好封装到另外的类中.换句话说.就是把对象的粒度扩大.让FlyWeight来控制原本

可能多个小粒度的对象.并把可共享的地方共享.形成统一管理.而可共享的部分必须

动态产生.显然是要用到Factory模式.这也就是FlyWeight很多情况都利用了厂模式.

并且工厂维护着一个共享池.这个池的作用就是为了使得.客户程序能充实际内存中

读取共享数据.如果客户搜索到数据.那么就返回一个共享对象.如果没有找到.那么就

加入到这个共享池中.

abstract class Flyweight

{

abstractpublic void Execute( OtherData oData );

}

下面考虑一个可能遇到的问题.假如某个出版社.的数据库是这样的

书号 作者 出版日期 价格

那么这里除了书号以外都又可能出现很大的重复.为了使内存减小投入我们可以考虑使用

FlyWeight模式.

public class Book{

private int bookNum;

private string Author;

private DateTime pubDate;

private float price;

public void Execute(){}

}

由此可以看出.Book中的大部分数据都又可能重复.那样会浪费很多的内存.那么我们来进行又效

的共享管理.

public class AuthorFlyWeight : FlyWeight{

private string author;

public string Author{

get{return author;}

set{author=value;}

}

}

public class pubDateFlyWeight : FlyWeight{

private DateTime pubDate;

public DateTime PubDate{

get{return pubDate;}

set{pubDate=value;}

}

}

public class PriceFlyWeight : FlyWeight{

private float price;

public float Price{

get{return price;}

set{price=value;}

}

}

//抽象工厂

abstract class FlyweightFactory{

//存储数据

protect Hashtable pool = new Hashtable();

public abstract Flyweight getFlyweight(string key){

}

}

public class AuthorFactory:FlyweightFactory{

public override Flyweight getFlyweight(string key){

AuthorFlyWeight reValue;

reValue = (AuthorFlyWeight)pool.get(key);

if(reValue == null) {

reValue = new AuthorFlyWeight();

pool.put(key,reValue);

}

return reVale;

}

}

后面与之类似..那么FlyWight模式我就介绍到这里....

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有