2015-02-23 50 views

回答

2

我們假設「Java緩存」是一個對象池(或對象池模式)。

我認爲不同之處在於對被緩存對象的理解是單例還是不單單。

在flyweight模式中,您可能會使用相同的由潛在多個客戶端從「工廠」獲取的對象。這需要不同的管理方式(如併發性,客戶端相關的工作等)。例如,如果您在同一時間可見的多個UI客戶端/視口中獲取相同的flyweight對象(讓我們說一個按鈕),那麼您最終將操縱可能會產生不一致的相同對象(例如按鈕文本)在這些不同的UI /視口上。這將不會發生,因爲每次請求對象時,池/緩存都會返回一個單獨的對象。

關於是不可變的,我在網上遇到了兩個例子,其中包括flyweight對象中的外部/改變狀態。好吧,我認爲將它作爲flyweight對象的一部分包含是完全錯誤的,因爲重點是減少內存佔用量,只要你可以正確管理對象。但我也認爲這是完全開放的討論。

4

Flyweight設計通常是不可變對象的存儲。

「Java緩存」不是一個明確定義的術語。這可能意味着很多事情,如結果緩存或資源對象池。

3

享元模式是一種結構設計模式 - 它會影響對象的結構設計。這種設計模式中的關鍵點是可共享和不可共享的狀態。可分享狀態存儲在Flyweight對象中(因爲它與上下文無關)。 也可能有外在狀態,這是不可共享的,並且指定該狀態落在客戶端上的負擔,因爲這是特定於上下文的。

現在你可以使用緩存來實現Flyweight模式,但是一般來說緩存與Flyweight模式沒有任何關係。高速緩存的思想具有更大的上下文,因爲它有利於通過重用來節省計算資源(CPU /內存/網絡)。

+0

感謝您的回答Shailendra。你能否給我一個很好的例子,而不使用緩存? – 2015-02-24 04:25:26

+1

看看http://stackoverflow.com/questions/14425671/what-is-the-difference-between-intrinsic-and-extrinsic-state-as-described-in-fly?rq=1 – Shailendra 2015-02-24 20:11:51

相關問題