知识卡片
享元模式与对象池的区别及String.intern的例证
内容
[[享元模式的定义、内外部状态与四个角色]]虽常用池实现,但与通用”对象池”关注点不同: 对象池着重复用,池中对象对客户端可互换;享元模式关注共享,重点是按内外部状态拆分建立 可共享集合。Java的String.intern()就是内置享元实例——检查常量池是否已有相同内容字符串, 有则返回引用。发散:”用池缓存对象”本身是中立手法,是对象池还是享元取决于是否存在 “外部状态相同则语义上是同一实例”这层业务含义。
参考来源
- 位置:《设计模式之禅(第2版)》第28章《享元模式》(源文件:_epub-src/text/part0130.html)
- 结论依据:原文用String.intern()方法演示Java API内置的享元模式实例,并说明"对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式在主要解决的对象的共享问题"。
- 原始内容:享元模式在Java API中也是随处可见……如果是String的对象池中有该类型的值,则直接返回对象池中的对象,那当然相等了……对象池着重在对象的复用上……它主要解决复用,而享元模式在主要解决的对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。