享元模式和对象池模式有什么区别?

What are the differences between Flyweight and Object Pool patterns?

在我看来,享元模式和对象池模式非常相似。两者都有租给客户的对象池。有什么区别?

它们的使用方式不同。

池中的对象只能同时由单个 "client" 使用。为此,必须从池中检出池中的对象,然后客户端可以使用它,然后客户端必须 return 将对象放回池中。相同对象的多个实例可能存在,直到池的最大容量。

相比之下,享元对象是单例的,可以被多个客户端同时使用。

至于并发访问,池化对象可以是可变的,它们通常不需要线程安全,因为通常只有一个线程会同时使用一个特定实例。享元必须是不可变的(最好的选择),或者实现线程安全。 (坦率地说,我不确定可变享元是否仍然是享元:))

至于性能和可伸缩性,池可能会成为瓶颈,如果所有池中的对象都在使用并且更多客户端需要它们,线程将被阻塞以等待池中的可用对象。 Flyweight 不是这种情况。