</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越多,空間節省也就越大.