我了解了Flyweight设计模式,并了解它存储了可以共享的对象,从而节省了堆使用量。 Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和Java缓存之间的真正区别是什么?
最佳答案
假设“Java缓存”是一个对象池(或对象池模式)。
我认为区别在于对缓存对象的了解是否为单例。
在flyweight模式中,您使用了可能由多个客户端从“工厂”中获取的对象。这需要不同的管理方式(例如并发,与客户相关的工作等)。例如,如果您在同时可见的多个UI客户端/视口中获取相同的flyweight对象(例如一个按钮),则最终会操纵相同的对象(例如按钮文本),这可能会导致不一致在这些不同的UI /视口上。不会发生这种情况,因为每次您请求对象时,池/缓存都会返回一个单独的对象。
关于不可变,我在网上遇到了几个示例,其中包括flyweight对象中的外部/改变状态。好吧,我认为将其包含在flyweight对象中并不是完全错误的,因为只要您可以正确地管理对象,这样做的目的就是减少内存占用。但是我也认为这是完全开放的讨论。