享元模式与对象池模式:何时使用?

24

据我所知,对象池是一种创建型模式,而享元是一种结构型模式,但实际上我不能看到它们之间有太大的区别。请问有人能向我解释一下它们之间的区别以及在实现中何时使用每个模式?

3个回答

35

一个区别在于,轻量级对象通常是不可变的实例,而从池中获取的资源通常是可变的。

因此,你创建轻量级对象是为了避免反复创建包含相同状态的多个对象实例的成本(因为它们都是相同的,您只需创建一个并在应用程序的所有位置重复使用它),而池中的资源是特定的资源,您要单独控制并可能具有不同的状态,但您不想支付创建和销毁的成本,因为它们都是在相同状态下初始化的。


3
最佳答案!我认为,Flyweight通常用于最小化内存占用,因为它仅包含唯一的项。对象池可以提高性能,但会导致内存消耗增加。 - Warlock
1
在某种程度上,我认为享元模式也会缓存一些东西。如果单个不可变的享元占用太多内存,那么节省的内存就难以确定了。你可以说这比你一遍又一遍地创建这些不可变对象要好。 - Chao

5

至少有两个主要区别:

  • 对象池是一组领域对象的容器,而享元通常一个领域对象。
  • 对象池通常包含一组可以同时共享的类似对象,例如数据库连接,而通常存在一组不同的享元对象,每个对象表示不同的状态。

1

这个网站提供了具体示例来描述设计模式。它做得相当不错,澄清了差异,并支持上面 Gabriel 的回答。http://www.oodesign.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接