28.5 最佳实践

28.5 最佳实践

Flyweight是拳击比赛中的特用名词,意思是“特轻量级”,指的是51公斤级比赛,用到设 计模式中是指我们的类要轻量级,粒度要小,这才是它要表达的意思。粒度小了,带来的问 题就是对象太多,那就用共享技术来解决。

享元模式在Java API中也是随处可见,如这样的程序就是一个很好的例子,如代码清单28-17所示。

代码清单28-17 API中的享元模式

1
2
3
4
5
6
7
8
9
10
11
12
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对象对客户端来说是完全相同的,它主要解决复用,而享元模式在主要解决的对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。