2012-02-04 9 views
3

state patternflyweight patternを使用した例は誰でも共有できます(フライウェイトパターンはメモリを節約するために状態オブジェクトを作成するためのものです)。StateパターンとFlyWeightパターン

更新日: 状態パターンとfwパターンの組み合わせを使用するにはどうすればよいですか?

+0

を使って書いた例です。パターンごとに1つ。それらのうちの1つを別の質問に移動してください – jgauffin

+0

これらのwikiページ*には例があります。 Javaの場合。 –

+1

@jgauffin私が見る限り、彼は1つの質問、州とfwのパターンの組み合わせを使用する方法を質問しました – DPM

答えて

3

オートボクシングは、例えば

(整数の値が小さいため)、オブジェクト生成を最小限にするためにフライウェイトパターンを使用しますブール値とバイト値では、すべての可能な値がキャッシュされます。

Javaでは、多くのコンポーネントで状態が使用されますが、ステートマシンには状態によって切り替えられる機能も含まれます。ここで

は、私はあなたが二つの質問を得たenumhttp://vanillajava.blogspot.com/2011/06/java-secret-using-enum-as-state-machine.html

+0

* "オートボクシングはフライウェイトパターンの一例です" * [sic] ...それはちょっと変わった言い回しではなく、もっと奇妙な例ですか?小さい値のキャッシング/再利用は、オートボクシングと比較して実際には詳細であると言えるでしょう。さらに、フライウェイトパターンの目的はメモリを節約することであり、オートボクシングはメモリを節約するための最後の**ものです。デフォルトのJava Mapにinteger {key、values}を格納するときに、Trove TIntIntHashMapの同等のものと比較して、メモリの無駄に言及しません。だから私は "オートボクシングはフライウェイトパターンの一例です"と言っているのはちょっと変わったかもしれないと思います。 – TacticalCoder

+1

フライウェイトは、通常、関数が実際に行っているものと比較して詳細だけです。これは、大部分が透明になるように設計されているためです。すなわち性能上の理由から純粋に行われる。 –

+0

HashMapとTIntIntHashMapの使用の違いは、エントリの整理方法です。整数がキャッシュされている場合、サイズは同じになります。例えばもしあなたが 'TIntArrayList'と' ArrayList 'を評価されたキャッシュに比較するならば。 –

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; 
    } 

} 

のように見えることができます特定の状態を処理するために使用されます。明確な責任を

  • 少ない条件文=より読みやすいコードを

    • 小規模クラス:だから、あなたは二つのことを取得します。