登陆注册
8183300000095

第95章 10 Flyweight模式在XML等数据源中应用

大B:“我们前面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料。”

每个CD有三个字段:

1、出片日期(year)

2、歌唱者姓名等信息(artist)

3、唱片曲目(title)

其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期不同曲目的CD。我们将‘歌唱者姓名’作为可共享的ConcreteFlyweight。其他两个字段作为UnsharedConcreteFlyweight。

首先看看数据源XML文件的内容:

《xml version=“1.0”?》

《collection》

《cd》

《title》Another Green World《/title》

《year》1978《/year》

《artist》Eno,Brian《/artist》

《/cd》

《cd》

《title》Greatest Hits《/title》

《year》1950《/year》

《artist》Holiday,Billie《/artist》

《/cd》

《cd》

《title》Taking Tiger Mountain(by strategy)《/title》

《year》1977《/year》

《artist》Eno,Brian《/artist》

《/cd》

……

《/collection》

虽然上面举例CD只有3张,CD可看成是大量重复的小类,因为其中成份只有三个字段,而且有重复的(歌唱者姓名)。

CD就是类似上面接口Flyweight:

public class CD{

private String title;

private int year;

private Artist artist;

public String getTitle(){return title;}

public int getYear(){return year;}

public Artist getArtist(){return artist;}

public void setTitle(String t){title=t;}

public void setYear(int y){year=y;}

public void setArtist(Artist a){artist=a;}

}

将“歌唱者姓名”作为可共享的ConcreteFlyweight:

public class Artist{

//内部状态

private String name;

//note that Artist is immutable。

String getName(){return name;}

Artist(String n){

name=n;

}

}

再看看Flyweight factory,专门用来制造上面的可共享的ConcreteFlyweight:Artist

public class ArtistFactory{

Hashtable pool=new Hashtable();

Artist getArtist(String key){

Artist result;

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

////产生新的。

if(result……null){

result=new Artist(key);

pool。put(key,result);

}

return result;

}

}

当你有几千张甚至更多CD时,Flyweight模式将节省更多空间,共享的flyweight越多,空间节省也就越大。

给个例子,coffee商店

package FlyWeight。coffeeshop;

public class Table{

private int number;

public int getNumber(){

return number;

}

public void setNumber(int number){

this。number=number;

}

public Table(int number){

super();

//TODO Auto-generated constructor stub

this。number=number;

}

}

package FlyWeight。coffeeshop;

public abstract class Order{?

public abstract void serve(Table table);

public abstract String getFlavor();

}

package FlyWeight。coffeeshop;

public class Flavor extends Order{

private String flavor;

public Flavor(String flavor){

super();

//TODO Auto-generated constructor stub

this。flavor=flavor;

}

public String getFlavor(){

return flavor;

}

public void setFlavor(String flavor){

this。flavor=flavor;

}

public void serve(Table table){

System。out。println(“Serving table” table。getNumber() “with flavor” flavor);

}

}

package FlyWeight。coffeeshop;

public class FlavorFactory{

private Order[]flavors=new Flavor[10];

private int ordersMade=0;//已经处理好的订单数

private int totalFlavors=0;//已购买的coffee风味种类数

public Order getOrder(String flavorToGet){

if(ordersMade>;0){

for(int i=0;i<ordersmade;i ){

if(flavorToGet。equalsIgnoreCase(flavors[i]。getFlavor()))

return flavors[i];

}

}

flavors[ordersMade]=new Flavor(flavorToGet);

totalFlavors ;

return flavors[ordersMade ];

}

public int getTotalFlavorsMade(){

return totalFlavors;

}

}

package FlyWeight。coffeeshop;

public class Client{

private static Order[]flavors=new Flavor[100];

private static int ordersMade=0;

private static FlavorFactory flavorFactory;

private static void takeOrders(String aFlavor){

flavors[ordersMade ]=flavorFactory。getOrder(aFlavor);

}

public static void main(String[]args){

flavorFactory=new FlavorFactory();

takeOrders(“Black Coffee”);

takeOrders(“Capucino”);

takeOrders(“Espresso”);

takeOrders(“Espresso”);

takeOrders(“Capucino”);

takeOrders(“Capucino”);

takeOrders(“Black Coffee”);

takeOrders(“Espresso”);

takeOrders(“Capucino”);

takeOrders(“Black Coffee”);

takeOrders(“Espresso”)。

for(int i=0;i<ordersmade;i ){

flavors[i]。serve(new Table(i));

}

System。out。println(\nTotal Flavor objrcts made:

flavorFactory。getTotalFlavorsMade());

}

}

//――

运行结果:

Serving table 0 with flavor Black Coffee

Serving table 1 with flavor Capucino

Serving table 2 with flavor Espresso

Serving table 3 with flavor Espresso

Serving table 4 with flavor Capucino

Serving table 5 with flavor Capucino

Serving table 6 with flavor Black Coffee

Serving table 7 with flavor Espresso

Serving table 8 with flavor Capucino

Serving table 9 with flavor Black Coffee

Serving table 10 with flavor Espresso

</ordersmade;i ){

</ordersmade;i ){

同类推荐
  • 组建家庭局域网与无线网

    组建家庭局域网与无线网

    该书是“快乐驿站”丛书之一,是一本精心为初级家庭电脑用户打造的局域网与无线网组建入门与提高的图书,同时还涉及一些办公网络的组建内容。《组建家庭局域网与无线网》以局域网和无线网的功能、设置以及实际应用为导向,用生动的实例、形象的图解和幽默的语言循序渐进地介绍了局域网和无线网的概念、产品、设计、组建、调试与维护的相关内容。
  • 一本书读懂大数据

    一本书读懂大数据

    本书是深入研究互联网思维的经典之作,从互联网思维的定义到互联网思维应用的具体案例表现。作者深入浅出、条分缕析,全面阐述互联网思维的内核与精神,逐一点评当前关于互联网思维的各种观点。本书从最初级的互联网思维应用到高端的粉丝经济,平台建设,自媒体营销的方法都有详细讲解介绍。让读者了解什么是互联网思维的同时还能学会把互联网思维运用到自己的工作学习已经生活中。
  • 一本书读懂24种互联网思维

    一本书读懂24种互联网思维

    本书整合的改变世界的24种互联网思维,让我们对互联网新思维的认识变得立体、系统起来;同时深入浅出、通俗易懂地从技术和实践分析互联网新思维与传统思维相比较的优势,医治互联网焦虑症。未来属于既能深刻理解传统商业的本质,同时又具备互联网思维的人。
  • 图说电子计算机

    图说电子计算机

    今天人们谈到计算机常常会把它和网络联系起来。20世纪90年代兴起的因特网其影响之广、普及之快也是大家始料未及的,也从没有一种技术能像网络一样日新月异,并迅速地改变着我们的学习和生活方式。因特网大大缩小了时空界限,为我们提供了快捷方便的交流途径。在未来10年内,计算机又将会有怎样飞速的发展呢?在互联网上进行医疗诊断、远程教学、电子商务、视频会议等活动已经实现,未来的互联网的传输速率将会提高100倍,大家可以随时随地连接到因特网上,更方便地进行交流、沟通和开展商务活动。
  • SEO智慧

    SEO智慧

    本书不仅是系统讲述搜索引擎优化(SEO)的原理、技法、思维、经验的畅销作品,而且论述了市场学、营销学、心理学怎样与搜索营销形成综合战略的经典著作。从说明网站的搭建该怎样围绕搜索引擎优化开始,到网站优化的具体策划和技术细节,再到搜索营销的持续开展,说明打造投资回报率高的网站应该怎样具备必需的搜索营销思维和战略做法,是作者12年网站营销经验,特别是搜索引擎优化(SEO)实现营销方面的技术和实践总结。
热门推荐
  • 异界虫族基地

    异界虫族基地

    带着虫族基地穿越了,出农民,爆狗,从现在开始,这里就是我的领地。
  • 我只想当一个安静的学霸

    我只想当一个安静的学霸

    “你渴望知识吗?”“不,我渴望妹子,很萌的那种!”“当你触及到人类的知识巅峰,无所不能的你想要什么就有什么。”“那我渴望知识!”……V裙541448173,需全订普裙676941643
  • 饕餮修真

    饕餮修真

    本书饕餮因吃了仙鹤,被罚重新投胎修仙。得到了龙宫的暗中支持,但修仙中却遭遇了重重困难,还遭到仙鹤童子的报复,饕餮最终战胜所有阻挠,得以重返仙界。饕餮(taotie)传说中龙之五子,见什么吃什么,由于吃得太多,最后被撑死。
  • 风雪归人

    风雪归人

    她仿佛看见他在塞北草原上那被篝火照耀着的不动声色的脸;仿佛听道那北疆雪原上他在她耳畔跟她言说的那个故事;仿佛看见他正骑着马儿踏雪朝她跑来。可他终归不属于她的那片原野。那儿有一望无际的天空,一望无际的大地。那儿独独留了她一人在空旷的天地里。
  • 叱咤仙魔录

    叱咤仙魔录

    小人物的成长史,百折不挠,勇往直前,书写不一样的人生经历!
  • 开局逍遥驸马爷

    开局逍遥驸马爷

    癌症患者陈逍穿越了,以为活不久的他,胆色过人屡干大事,还泡了一个美女。新婚之夜,皇宫来人,未婚妻竟是逃出宫的公主?看着未婚妻被带走,陈逍怒了:“这驸马爷,老子当定了!”
  • 忆清雪

    忆清雪

    若今生无缘,又怎会在冥冥中遇见。弱水三千,只为你如花笑颜。一朝变迁,追忆往昔,方大梦初醒,而你却早已不见。若有来生,我定执子之手永不放,陪你到地老天荒……
  • 校园侦探三人组

    校园侦探三人组

    《校园侦探三人组》主要内容有:够狠,才这么点小事就开“批斗会”。难道我会这么轻易就挨“枪子”吗?我的逻辑思维总有点用吧?“开会是为了教训我,教训我是为了‘杀鸡吓猴’(即杀我给同学看),给同学看足为了培养他们道德,培养他们道德是为了思政考试得分,考试得分是为了激励他们,激励他们足为了气死我,气死我是为了让我性质更恶劣,性质更恶劣是为了再次批判我……”我那个巧夺天丁的大脑呀,竟然给了我这么一个连环性的结果预测,说得校长同志感觉此事错综复杂后果严重,一时间竟然呆住了。《校园侦探三人组》一起进入神秘地带经历了一次次冒险,破解了一个个谜案……扑朔迷离、险象环生,于是有了这本情节曲折、悬念迭出的科幻小说。
  • 月照萱阳城

    月照萱阳城

    张萱和张阳姐弟俩经历了母亲去世,父亲入狱的变故,相依为命,在城市里碰到了很多温暖的人,姐弟俩成长的故事,最后拥有了属于他们的城市。
  • 书穿女主要逆袭

    书穿女主要逆袭

    高龄剩女杜晓晓穿到暗(rou)黑(wen)世界,成为了暗(rou)黑(wen)女主角,为了生存下去,杜晓晓努力远离暗(rou)黑(wen),保护好自己,快乐种田,幸福生活的故事。