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

What is the difference between Flyweight design pattern and Java cache

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

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

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

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

现在您可以使用缓存来实现享元模式,但缓存通常与享元模式本身无关。缓存的概念具有更大的上下文,因为它有利于通过重用节省您的计算资源 (CPU/Memory/Network)。

让我们假设 "Java cache" 是一个对象池(或对象池模式)。

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

在享元模式中,您使用可能由多个客户端从 "the factory" 获取的 相同 对象。这需要不同的管理方式(如并发、与客户端相关的工作等)。例如,如果您在同时可见的多个 UI clients/viewports 中获取同一个享元对象(假设是一个按钮),那么您最终会操作同一个对象(例如按钮文本),这可能会在这些不同的 UIs/viewports 上造成不一致。这不会发生,因为 pool/cache 会在你每次请求一个对象时 return 你一个单独的对象。

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