我读到了Flyweight设计模式并且知道它存储了可以共享的对象,以节省堆使用。 Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和java缓存之间的真正区别是什么?
答案 0 :(得分:5)
Flyweight设计通常是不可变对象的存储。
A" Java缓存"不是一个定义明确的术语。它可能意味着许多事情,例如结果缓存或资源对象池。
答案 1 :(得分:3)
Flyweight模式是一种结构设计模式 - 它会影响对象的结构设计。关键点在于此 设计模式是可共享和不可共享的状态。可共享状态存储在Flyweight对象中(因为它与上下文无关)。 也可能存在不可共享的外在状态,并且指定该状态的负担落在客户端上,因为这是特定于上下文的。
现在你可以使用缓存来实现Flyweight模式,但缓存一般与Flyweight模式无关。缓存的概念具有更大的背景,因为它有利于通过重用来节省您的计算资源(CPU /内存/网络)。
答案 2 :(得分:3)
我们假设“Java缓存”是一个对象池(或对象池模式)。
我认为不同之处在于对缓存对象的理解是单身还是非单身。
在flyweight模式中,您可以使用可能由多个客户端从“工厂”获取的相同对象。这需要不同的管理方式(如并发,与客户相关的工作等)。例如,如果您在同时可见的多个UI客户端/视口中获取相同的flyweight对象(比如说一个按钮),那么您最终会操纵可能会产生不一致的相同对象(例如按钮文本)在这些不同的UI /视口上。这不会发生,因为每次请求对象时,池/缓存都会返回一个单独的对象。
关于不可变,我在网上遇到了几个例子,包括flyweight对象中的外在/改变状态。好吧,我不认为将它作为flyweight对象的一部分包含它是完全错误的,因为只要你可以正确地管理对象,重点是减少内存占用。但我也认为讨论完全开放。