この記事では、JavaのXiangyuanモードに基づいたGozi Chessゲーム機能の実装について説明します。次のように、参照のために共有してください。
1。パターン定義
World Modeをお楽しみください。多くの細かいオブジェクトを共有された方法で効率的にサポートします。メモリ内の既存のオブジェクトを多重化することにより、オブジェクトインスタンスを作成するシステムのパフォーマンス消費を減らします。 Xiangyuanの英語はフライウェイトです。これは、特に小さなオブジェクト、つまりきれいなオブジェクトを意味します。
2。モデルの例
1。パターン分析
Goziゲームを借りて、このパターンを説明します。
2。ユアンモードを楽しむ静的クラス図
3。コードの例
3.1抽象チェスマンの作成
パッケージcom.demo.flyweight.object; public abstract class abstractchessman {//チェスペーパー座標保護されたint x;保護されたインスト。 //チェスペーパーカテゴリ(黒|白)保護された弦楽チェス。 public abstractchessman(string chess){this.chess = chess; } // point座標公開抽象ボイドポイントを設定します(int x、int y); // show chesspaper情報public void show(){system.out.println(this.chess + "(" + this.x + "、" + this.y + ")"); }}3.2 BlackChessmanの作成
パッケージcom.demo.flyweight.object; public class blackchessmanはabstractchessman { / ** * constructorize black chessman * / public blackchessman(){super( "●"); System.out.println( " - BlackChessman Construction Exec !!!"); } //ポイント座標@override public void point(int x、int y){this.x = x; this.y = y; //チェスコンテンツshow(); }}3.3 Whitechessmanを作成します
パッケージcom.demo.flyweight.object; public class whitechessmanはabstractchessman { / ** * constructorize white chessman * / public whitechessman(){super( "○"); System.out.println( " - Whitechessman Construction Exec !!!"); } //ポイント座標@override public void point(int x、int y){this.x = x; this.y = y; //チェスピースコンテンツshow(); }}3.4チェスマン工場を作成します
パッケージcom.demo.flyweight.factory; import java.util.hashtable; Import com.demo.flyweight.object.abstractchessman; Import com.demo.flyweight.objessman; Import com.demo.flyweight.objessman; public class fivessmanfutory patternfutory patternfutory patternfutoryman; fivechesmanfactory fivechessmanfactory = new fivechesmanfactory(); //共有オブジェクトを保存するプライベートファイナルハッシュテーブル<文字、abstractchessman> cache = new Hashtable <Character、AbstractChessman>(); // privatization constructor private fivechesmanfactory(){} // singleton Factory public static fivechesmanfactory getInstance(){return fivechesmanfactory; } / ** *文字に基づいてチェスの断片を取得 * * @param c *(b:black chessw:white chess) * @return * / public abstractchessman getChessmanObject(Char C){//キャッシュ抽象的なオブジェクトのインスタンスを取得しますabstractchessman abstractchessman = this.cache.get(c); if(abstractchessman == null){//キャッシュにポーンオブジェクトインスタンス情報がない場合、ポーンオブジェクトインスタンスを作成し、キャッシュスイッチ(c)に入れます{case 'b':abstractchessman = new blackchessman();壊す;ケース 'W':abstractchessman = new Whitechessman();壊す;デフォルト:break; } //違法な文字がnullを入力するのを防ぐためにif(abstractchessman!= null){// this.cache.put(c、abstractchessman); }} //キャッシュにチェスオブジェクトがある場合は、直接抽象的なabstractchessmanを返します。 }}3.5クライアントの実装
パッケージcom.demo; import java.util.random; import com.demo.flyweight.factory.fivechessmanfactory; import com.demo.flyweight.obstractchessman;/** * Main Application * @author */public class client {/** @param Factory fivechesmanfactory fivechessmanfactory = fivechessmanfactory .getInstance(); RANDOM RANDOM = new Random(); int radom = 0; abstractchessman abstractchessman = null; //(int i = 0; i <10; i ++){radom = random.nextint(2);のチェスピースを取得します。 switch(radom){//ブラックチェスケースを取得します0:abstractchessman = fivechessmanfactory.getChessmanObject( 'b');壊す; //ホワイトチェスケースを取得する1:AbstractChessman = fivechessmanfactory.getChessmanObject( 'w');壊す; } if(abstractchessman!= null){abstractchessman.point(i、random.nextint(15)); }}}}4。操作結果
-WhiteChessman Construction Exec !!!
○(0,2)
○(1,6)
--BlackChessman Construction Exec !!!
●(2,3)
○(3,14)
○(4,13)
○(5,8)
●(6,14)
●(7,0)
●(8,3)
○(9,8)
3.楽しさモードの2つの状態
内因性状態:環境の変更によって変化することはなく、起点オブジェクトの内部状態情報に保存されます。この固有の状態は共有できます。他のオブジェクトの場合、その値はまったく同じです。ゴジの「黒い破片」と「白い断片」のように、それが表す状態は内部状態です。
外部状態:環境の変化とともに変化するため、状態を共有することはできません。属の異なるオブジェクトの場合、その値は異なる場合があります。 Xiangyuanオブジェクトの外部状態は、クライアントによって保存する必要があります。 Xiangyuanオブジェクトが作成され、使用する必要がある後、Xiangyuanオブジェクトに渡されます。 Goziの位置情報と同様に、表現される状態は生態学の目的の外部状態です。
したがって、Xiangyuanの外部および内部状態は2つの独立した状態であり、互いに関係がありません。
IV。このモデルの設計の原則
1.メモリ空間を減らすために、細粒オブジェクトを共有します。
2。変化する部分とシステムの変更されていない部分を効果的に分離します。
5。機会を使用します
1.システムに特定のオブジェクトタイプのインスタンスが多数ある場合。
2。システム設計では、オブジェクトインスタンスを分類した後、実際の異なるカテゴリがほとんどないことを見つける時が来ました。
6.ユアンモードを楽しむ静的クラス図
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。