GOF23デザインパターンのフライ級

フライ級フライ級

シナリオ:あなたは、同一または類似したオブジェクトの数を持っている場合は、メモリリソースを節約することができます

コア:

Flyweightパターンを効率的にきめの細かいオブジェクトの再利用の多数をサポートするための方法を共有します

キーフライ級オブジェクトは共有を行い、内部および外部の状態ステータスの区別です。

       内部状態:共有するためには、環境の変化(共通部分)を変更しないでください

       外部ステータス:ないシェアは、環境に応じて変化します(ユニークな部分)に変更されます

元のパターンを実現し、楽しみなさい:

-FlyweightFactoryフライ級ファクトリクラス:一般的にフライ級のキーと値のペアをプールするように設計の作成と管理フライ級オブジェクト、

フライ-FlyWeight抽象クラス:通常パブリックインタフェースまたは抽象クラス宣言方法は、外部にオブジェクトを提供することができ、これらの方法は、状態の内部状態の外部に設けられています。

フライ級-ConcreteFlyWeight特定のクラス:内部状態を保存するためにメンバ変数を提供

フライ級-UnsharedConcreteFlyWeught非共有カテゴリ:共有サブクラスが非共有クラスのフライ級になるように設計することができません

実際にシーン:スレッド・プール、データベース接続プール、Stringクラス

利点:大幅にメモリ内のオブジェクトの数を減らす、同一又は類似のオブジェクトが一つだけを保持し、リソースの節約と、外部の状態は独立し、内部の状態に影響を及ぼしません

短所:複雑なモードは、プログラムロジックが複雑、メモリを節約するために、共有パルパーの内部状態は、外部の状態、外部の読み出し動作時間は、宇宙の時間を長くなっている状態を分離しました

例えば:(ポジション内部状態:カラーサイズ及び外部の状態を形状)に戻ります

/ **
 *外部の状態基づいUnsharedConcreteFlyWeight
 * @authorセイル入るコード
 *
 * /
publicクラスポイント{
 専用のint X;
 プライベートint型Y、
 
公共ポイント(INTのX、YのINT){
 this.x =でXと、
 this.yは=からY;
}
公共INTのgetX(){
 戻りX。
}
公共ボイドSETX(INT X){
 this.x = xと;
}
公共int型のgetY(){
 Yを返します。
}
公共ボイドSETYの(int型のY){
 this.y = Y。
}
}
/ **
 *享元类
 * @author小帆敲代码
 *
 * /
パブリックインターフェイスチェス{
  ボイドsetColorを(文字色)。
  ストリングGETCOLOR()。
  無効表示(点P);
}
クラスConcreteChessはチェス{実装
  プライベート文字列の色を、
  
 公共ConcreteChess(文字色){
   this.color =色。
  }
 @Override
 公共ボイドsetColorを(文字色){
  this.color =色。
 }
 @Override
 パブリックストリングGETCOLOR(){
  this.colorを返します。
 }
 @Override
 公共ボイドディスプレイ(点P){
  System.out.printlnは(色+ "棋" + "在(" + p.getX()+ " "+ p.getY()+")点显示")。
 }
}
/ **
 *享元工厂
 * @author小帆敲代码
 *
 * /
publicクラスFlyWeightFactory {
  //享元池
 プライベート静的地図<文字列、チェス>マップ=新しいHashMapの<文字列、チェス>();
 パブリック静的チェスgetChess(文字色){
  場合(map.containsKey(色)!){
   map.put(色、新ConcreteChess(色));
  }
  戻りmap.get(色)。
 }
}
パブリッククラスクライアント{
  パブリック静的無効メイン(文字列[] args){
     チェスC1 = FlyWeightFactory.getChess( "黑")。
     チェスC2 = FlyWeightFactory.getChess( "黑")。
     System.out.println(C1)。
     System.out.println(C2)。
     System.out.println( "增加外部状态-----");
     c1.display(新しいポイント(10,10));
     c2.display(新しいポイント(15,15));
  }
}

おすすめ

転載: www.cnblogs.com/code-fun/p/11351592.html