在我看来,Flyweight和Object Pool模式非常相似。两者都有租给客户的物品池。有什么区别?
答案 0 :(得分:17)
它们的使用方式不同。
只能由单个“客户端”同时使用池化对象。为此,必须从池中检出池化对象,然后客户端可以使用它,然后客户端必须将对象返回池中。可能存在多个相同对象的实例,直到池的最大容量。
相比之下,Flyweight对象是单例,并且可以由多个客户端同时使用。
对于并发访问,池化对象可以是可变的,并且它们通常不需要是线程安全的,因为通常只有一个线程将同时使用特定实例。 Flyweight必须是不可变的(最佳选项),或实现线程安全。 (坦率地说,我不确定一个可变的Flyweight是否仍然是Flyweight :))
至于性能和可伸缩性,池可能成为瓶颈,如果所有池化对象都在使用中,并且更多客户端需要它们,则线程将被阻塞,等待池中的可用对象。 Flyweight不是这种情况。