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