5

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

4

3 回答 3

6

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

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

于 2015-02-23T09:11:52.523 回答
5

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

我认为不同之处在于对缓存对象是否为单例的理解。

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

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

于 2017-03-20T14:19:35.950 回答
3

享元模式是一种结构设计模式——它会影响对象的结构设计。这种设计模式的关键点是可共享和不可共享的状态。可共享状态存储在享元对象中(因为它与上下文无关)。也可能存在不可共享的外部状态,并且指定该状态的责任落在客户端身上,因为这是特定于上下文的。

现在您可以使用缓存来实现享元模式,但缓存通常与享元模式无关。缓存的想法具有更大的背景,因为它有利于通过重用来节省您的计算资源(CPU/内存/网络)。

于 2015-02-23T09:26:16.847 回答