Design patterns Flyweight与对象池模式:每种模式何时有用?

Design patterns Flyweight与对象池模式:每种模式何时有用?,design-patterns,flyweight-pattern,objectpool,Design Patterns,Flyweight Pattern,Objectpool,据我所知,对象池是一种创作模式,而flyweight是一种结构模式,但实际上我看不出两者之间有多大区别。有人能给我解释一下它们之间的区别以及它们在实现中什么时候有用吗?一个区别是flyweights通常是不可变的实例,而从池中获取的资源通常是可变的 因此,您可以创建Flyweight,以避免重复创建包含相同状态的多个对象实例的成本(因为它们都是相同的,您只需创建一个实例并在应用程序中的所有位置重复使用),虽然池中的资源是您想要单独控制的特定资源,并且可能具有不同的状态,但您不想支付创建和销毁的成

据我所知,对象池是一种创作模式,而flyweight是一种结构模式,但实际上我看不出两者之间有多大区别。有人能给我解释一下它们之间的区别以及它们在实现中什么时候有用吗?

一个区别是flyweights通常是不可变的实例,而从池中获取的资源通常是可变的


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

至少会想到两个主要区别:

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

本网站通过具体示例介绍了这两种模式。它很好地澄清了两者之间的区别,并支持加布里埃尔的上述回应

最好的答案!我认为,Flyweight通常用于最小化内存量,因为它只包含唯一的项目。对象池可以提高性能,但会导致高内存消耗。在某种程度上,我认为flyweight模式也会缓存一些东西。如果单个不可变的flyweight占用了太多内存,那么很难说它节省了多少内存。你可以说这比你一次又一次地创建这些不可变的对象要好。