下面是運行結(jié)果:
Concrete---Flyweight : Google
Concrete---Flyweight : Qutr
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
objSize = 2
我們定義了6個對象,其中有5個是相同的,按照Flyweight模式的定義“Google”應(yīng)該共享一個對象,在實際的對象數(shù)中我們可以看出實際的對象卻是只有2個。
下面給出一個簡易的UML圖:
總結(jié):
Flyweight(享元)模式是如此的重要,因為它能幫你在一個復(fù)雜的系統(tǒng)中大量的節(jié)省內(nèi)存空間。在GOF的書中舉了文本處理的例子,我覺得非常恰當(dāng)。那么,在Java中String這個類型比較特殊,為什么呢,看下面的例子:
String a = "hello";
String b = "hello";
if(a == b)
System.out.println("OK");
else
System.out.println("Error");
輸出結(jié)果是:OK。稍有經(jīng)驗的人都可以看出if條件比較的是兩a和b的地址,也可以說是內(nèi)存空間。那么Sting的實現(xiàn)是不是使用了Flyweight模式呢,不得而知,到現(xiàn)在還沒有研究過。