Flyweight设计模式和Java缓存之间有什么区别

Aak*_*ena 5 java caching design-patterns flyweight-pattern

我了解了Flyweight设计模式,并了解它存储了可以共享的对象,从而节省了堆的使用。Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和Java缓存之间的真正区别是什么?

Pet*_*rey 6

Flyweight设计通常是不可变对象的存储。

“ Java缓存”不是一个明确定义的术语。它可能意味着很多事情,例如结果缓存或资源对象池。


std*_*out 6

我们假设“Java 缓存”是一个对象池(或对象池模式)。

我认为区别在于对缓存对象是否是单例的理解。

在享元模式中,您使用由潜在的多个客户端从“工厂”获取的同一对象。这需要不同的管理方式(例如并发、与客户端相关的工作等)。例如,如果您在同时可见的多个 UI 客户端/视口中获取相同的享元对象(例如按钮),那么您最终会操作相同的对象(例如按钮文本),这可能会造成不一致在这些不同的 UI/视口上。这种情况不会发生,因为每次您请求一个对象时,池/缓存都会返回一个单独的对象。

关于不可变,我在网上遇到了几个例子,其中包括享元对象中的外部/变化状态。嗯,我不认为将它作为享元对象的一部分是完全错误的,因为重点是减少内存占用,只要您可以正确管理对象即可。但我也认为这是完全可以讨论的。