第三章 Java模式研究之Flyweight模式(2 / 3)

程序代碼:

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文件的內容:

程序代碼:

<?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>