フライ級2024 年の最新の入門チュートリアル。このコースでは 入門,実現, について学習できます。
フライ(フライパターン)は、主にメモリ使用量を削減し、性能を改善するために作成されたオブジェクトの数を減らすために使用されます。 デザインパターンのこのタイプは、アプリケーションによって要求されるように、オブジェクトの構造を改善するために、オブジェクトの数の減少を提供する構造モデルを、属します。
フライ級は、一致するオブジェクトが見つからない場合は、新しいオブジェクトが作成され、同じの既存のオブジェクトを再利用してみてください。 私たちは、このパターンを示すために5つのオブジェクトを作成することによって、別の場所に分散し20円を描画します。 カラー属性は、既存のサークルオブジェクトをチェックするために使用されているので、使用可能な色の唯一の5種類、以来。
意図:きめの細かい多数のオブジェクトをサポートするための共有を使用します。
主に解決するために:あなたは、メモリに直接戻る既存のオブジェクトを同じサービス要求を持っている場合は多数のオブジェクトでは、それはメモリオーバーフローを引き起こす可能性があり、我々は、再作成を避けるために、一緒に一部請求抽象を置きます。
使用する時:1、システムは、多数のオブジェクトを有します。2は、これらのオブジェクトは、多くのメモリを消費します。 3、これらのオブジェクトのほとんどの状態を外部化することができます。 図4に示すように、これらのオブジェクトの多くは、オブジェクトが、外側集オブジェクトから削除されたときに、各オブジェクトの代わりにオブジェクトを使用して設定することができ、固有の状態に応じてグループに分けることができます。 5、システムがこれらのオブジェクトのアイデンティティに依存しない、これらのオブジェクトは区別がつきません。
修正方法:メモリ内に存在する場合に固有の識別コードで分析し、特定されたオブジェクトの固有の識別コードが返されます。
キーコード:これらのオブジェクトに格納されているのHashMap。
アプリケーション例:文字列内の1、JAVA、それが返されると、内部の文字列バッファ・プールに格納されている文字列を作成しない場合。図2に示すように、データ・プールデータベース。
利点:効率が改善されるように大幅に、システムのメモリを削減する、オブジェクトの作成を減らします。
短所:システム担当の増加は、我々はそれ以外の場合は、カオスシステムを作成し、内部および外部の状態ステータス、および本質的に変化の内部状態に変化すべきではないされている自然の外部状態を分離する必要があります。
使用シナリオ:1、システムは、類似の多数のオブジェクトを有します。2は、シーンをプールする必要があります。
、1の状態の外部と内部分裂の状態に注意を払うか、スレッドの安全性の問題を引き起こす可能性があります注意してください 。 2、クラスファクトリオブジェクトを制御することが持っている必要があります。
私たちは、エンティティ・クラスサークル ShapeインタフェースのShapeインタフェースと実装を作成します。 次のステップは、ファクトリクラスを定義することですShapeFactory。
キーカラーサークルは、オブジェクトの名前のHashMapのサークルを持っているShapeFactory。要求が受信されるたびに、特定の色の円を作成します。 見つかったサークルオブジェクトは、オブジェクトが返された場合に円オブジェクトにそのHashMapをチェックShapeFactory、それ以外の場合は、新しいオブジェクトのその後の使用のために準備するためにハッシュマップに格納され、オブジェクトがクライアントに返されますが作成されます。
FlyWeightPatternDemo、ShapeFactoryShapeオブジェクトを使用するクラスを取得するために私たちのデモ。 これは、情報を送信します(赤/緑/黒/青 /白)ShapeFactoryには、オブジェクトの色を取得する必要があります。
インターフェイスを作成します。
Shape.java
パブリック・インタフェースShape { ボイドドロー(); }
インターフェイスを実装するエンティティクラスを作成します。
Circle.java
パブリッククラスサークル{Shapeを実装します プライベート文字列の色。 プライベートint型のx; プライベートint型のy; プライベートint型の半径。 公共のサークル(文字列の色){ this.color =色。 } 公共ボイドSETX(int型x)は{ this.x = X; } 公共ボイドSETYの(int型のy)は{ this.y = Y; } 公共ボイドsetRadius(int型の半径){ this.radius =半径; } @Override 公共ボイドドロー(){ System.out.println( "サークル:ドロー()[色:" +カラー + "、X:" + X +」、Y: "+ yの+"、半径: "+半径)。 } }
与えられた情報に基づいてオブジェクトのエンティティクラスを生成するファクトリを作成します。
ShapeFactory.java
輸入java.util.HashMapを; パブリッククラスShapeFactory { プライベート静的最終のHashMap <文字列、シェイプ> circleMap =新しいHashMapの(); パブリック静的形状getCircle(文字列の色){ サークルサークル=(サークル)circleMap.get(色)。 {(円== null)の場合 円=新しいサークル(色)。 circleMap.put(色、サークル)。 System.out.println( "色の作成サークル:" +色)。 } 円を返します。 } }
色情報を渡すことによって、クラスのエンティティオブジェクトを取得するために工場を使用してください。
FlyweightPatternDemo.java
パブリッククラスFlyweightPatternDemo { プライベート静的最後の文字列の色[] = {「赤」、「緑」、「青」、「白」、「黒」}; 公共の静的な無効メイン(文字列[] args){ {(;;私は20を<++ iが0 = int型)のために サークルサークル= (サークル)ShapeFactory.getCircle(getRandomColor()); circle.setX(getRandomX()); circle.setY(getRandomY()); circle.setRadius(100)。 circle.draw()。 } } プライベート静的文字列getRandomColor(){ 色[(int型)(Math.random()* colors.lengthで)]を返します。 } プライベート静的int型getRandomX(){ リターン(int型)(Math.random()* 100); } プライベート静的int型getRandomY(){ リターン(int型)(Math.random()* 100); } }
出力を確認します。
色の作成サークル:ブラック サークル:ドロー()[カラー:ブラック、X:36、Y:71、半径:100 色の作成サークル:グリーン サークル:ドロー()[色:グリーン、X:27、yは:27、半径:100 色の作成サークル:ホワイト サークル:ドロー()[色:ホワイト、X:64、yは:10、半径:100 色の作成サークル:レッド サークル:ドロー()[色:赤、X:15、yは:44、半径:100 サークル:ドロー()[色:グリーン、X:19、yは:10、半径:100 サークル:ドロー()[色:グリーン、X:94、yは:32、半径:100 サークル:ドロー()[色:ホワイト、X:69、yは:98、半径:100 色の作成サークル:ブルー サークル:ドロー()[色:ブルー、X:13、Y:4、半径:100 サークル:ドロー()[色:グリーン、X:21、yは:21、半径:100 サークル:ドロー()[色:ブルー、X:55、Y:86、半径:100 サークル:ドロー()[色:ホワイト、X:90、yは:70、半径:100 サークル:ドロー()[色:グリーン、X:78、yは:3、半径:100 サークル:ドロー()[色:グリーン、X:64、yは:89、半径:100 サークル:ドロー()[色:ブルー、X:3、Y:91、半径:100 サークル:ドロー()[色:ブルー、X:62、Y:82、半径:100 サークル:ドロー()[色:グリーン、X:97、yは:61、半径:100 サークル:ドロー()[色:グリーン、X:86、yは:12、半径:100 サークル:ドロー()[色:グリーン、X:38、yは:93、半径:100 サークル:ドロー()[色:赤、X:76、yは:82、半径:100 サークル:ドロー()[色:ブルー、X:95、Y:82、半径:100