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

</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);

////產生新的Artist

if(result == null) {

result = new Artist(key);

pool.put(key,result);

}

return result;

}

}

當你有幾千張甚至更多CD時,Flyweight模式將節省更多空間,共享的flyweight越多,空間節省也就越大.