Flyweight是拳击比赛中的特用名词,意思是“特轻量级”,指的是51公斤级比赛,用到设计模式中是指我们的类要轻量级,粒度要小,这才是它要表达的意思。粒度小了,带来的问题就是对象太多,那就用共享技术来解决。
享元模式在Java API中也是随处可见,如这样的程序就是一个很好的例子,如代码清单28-17所示。
代码清单28-17 API中的享元模式
public class Test { public static void main(String args) { String str1 = "和谐"; String str2 = "社会"; String str3 = "和谐社会"; String str4; str4 = str1 + str2; System.out.println(str3 == str4); str4 = (str1 + str2).intern; System.out.println(str3 == str4); }}
看看Java的帮助文件中String类的intern方法。如果是String的对象池中有该类型的值,则直接返回对象池中的对象,那当然相等了。
需要说明一下的是,虽然可以使用享元模式可以实现对象池,但是这两者还是有比较大的差异,对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式在主要解决的对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。