2012-02-04 56 views
3

任何人都可以共享例如使用state patternflyweight pattern(輕量級的模式是一個用於創建對象的狀態,以節省內存)?國家和輕量級模式

UPDATE: 如何使用的狀態和FW圖案的組合?

+0

你有兩個問題寫了一個例子。每種模式一個。將其中一個移至單獨的問題 – jgauffin 2012-02-04 10:45:03

+0

這些wiki頁面中的每個*都有*示例。在Java中。 – 2012-02-04 11:07:37

+1

@jgauffin至於我可以看到他已經問了一個問題,如何使用的狀態和FW圖案的組合 – DPM 2012-02-04 11:28:56

回答

3

自動裝箱使用輕量級圖案到對象創建最小化(對於整數的小值)

例如對於布爾和字節,所有可能的值都被緩存。

Java使用狀態爲許多部件,但是狀態機還包括通過狀態切換功能。

這裏是我使用enumhttp://vanillajava.blogspot.com/2011/06/java-secret-using-enum-as-state-machine.html

+0

*「Autoboxing是一個輕量級模式的例子」* [原文如此...這是不是一個奇怪的措辭和一個更奇怪的例子!?人們可以說,與自動裝箱相比,小值的緩存/重用實際上是一個細節。此外,flyweight模式的目標是節省內存,自動裝箱是節省內存的**最後一件事情。在將默認Java Map中的整數{key,values}存儲爲與Trove TIntIntHashMap中的相同值時相比,我甚至不會提及內存浪費。所以我認爲說「Autoboxing是一個輕量級模式的例子」可能有點奇怪。 – TacticalCoder 2012-02-04 12:18:20

+1

與實際功能相比,Flyweights通常只是細節。這是因爲它們的設計基本上是透明的。即純粹出於性能原因完成。 – 2012-02-04 12:45:08

+0

使用HashMap和TIntIntHashMap的區別在於條目的組織方式。如果整數被緩存,則大小將相同。例如如果您比較了'TIntArrayList'和'ArrayList '的緩存值。 – 2012-02-04 12:47:35

1

我通常使用狀態模式來避免的條件語句。

代替使用:

switch (state) 
{ 
    case ParserState.BeforeMethod: 
     //do some processing 
     break; 
    case ParserState.InMethod: 
     //do some processing 
     break; 
} 

我可以只寫:

currentState = currentState.process(context); 

樣品類可以看起來像

public class SomeClass : ParserState 
{ 
    public ParserState process(IParserContext context) 
    { 
     //do some proceccing 

     if (m_completed) 
      return new SomeOtherState(); 

     return this; 
    } 

} 

即邏輯被移動到小的類,其是用於處理特定的狀態。所以,你得到了兩兩件事:

  • 小班明確職責
  • 以下條件語句=更可讀的代碼。