JAVA設計モードの享元モデルについて


享元モード(Flyweight Pattern)は、主に作成対象数を減少させ、メモリの占有率を減少させ、性能を向上させるために使用される。このタイプの設計モードは構造モードに属しており、対象数を減らして適用に必要なオブジェクト構造を改善する方法を提供している。
享元モードは既存の同類のオブジェクトを再利用しようとしていますが、該当するオブジェクトが見つからない場合は、新しいオブジェクトを作成します。このモードを5つのオブジェクトを作成することにより,異なる位置に分布する20個の円を描いて実証する。カラー属性は5つの色しか使用できないので、既存のCircureオブジェクトを確認するために使用される。
紹介する
意図:
共有技術を駆使して、大量の微細度の対象を効果的にサポートします。
主要解決:
大量の対象がある場合、メモリが溢れ出す恐れがあります。その中の共通部分を抽象的にして、同じ業務要求があれば、直接メモリにある対象に戻り、再作成を避けます。
いつ使用しますか
1、システムには大量のオブジェクトがあります。
2、これらのオブジェクトは大量のメモリを消費します。
3、これらのオブジェクトの状態は、ほとんどが外部化されます。
4、これらの対象は含蓄の状態によって多くのグループに分けられます。対象から除外すると、各グループのオブジェクトは一つのオブジェクトで代替できます。
5、システムはこれらのオブジェクトのアイデンティティに依存しない。これらのオブジェクトは識別できない。
どう解決しますか
一意の識別コードで判断し、メモリにある場合は、この一意の識別コードによって識別されたオブジェクトを返す。
キーコード:
これらのオブジェクトをHashMapで保存します。
アプリケーションの例:
1、JAVAのStringは、ある場合は戻り、ない場合は文字列キャッシュに格納する文字列を作成します。
2、データベースのデータプール。
利点:
オブジェクトの作成を大幅に削減し、システムのメモリを低減し、効率を向上させます。
短所:
システムの複雑さを高め、外部状態と内部状態を分離する必要があり、また外部状態が固有化された性質を持っているため、内部状態の変化によって変化するべきではなく、システムの混乱を引き起こします。
使用シーン:
1、システムには多くの類似対象がある。
2、バッファが必要なシーン。
注意事項:
1、外部状態と内部状態を区分することに注意し、スレッドの安全問題を引き起こす可能性があります。
2、これらの種類は必ず工場の対象があります。
実現する
Shapeインターフェースを作成し、Shapeインターフェースを実現するエンティティクラスCirculeを作成します。次は工場種類のShape Factoryを定義します。
Shape FactoryにCircureのHashMapがあります。その中のキーはCircureオブジェクトの色です。要求をいつ受信しても、特定の色の円が作成されます。Shape Factoryは、HashMapのcirceleオブジェクトをチェックし、Curleオブジェクトが見つかったら、そのオブジェクトに戻ります。そうでなければ、hashmapに記憶された新しいオブジェクトを作成して、クライアントに戻ります。
FlyWeight PatternDemo、私たちのプレゼンテーションクラスはShape Factoryを使ってShapeオブジェクトを取得します。それはShape Factoryに情報を伝達して、必要なオブジェクトの色を取得します。

ステップ1
インターフェースを作成します。

public interface Shape {
  void draw();
}
ステップ2
インターフェースを実現するエンティティクラスを作成します。

public class Circle implements Shape {
  private String color;
  private int x;
  private int y;
  private int radius;
 
  public Circle(String color){
   this.color = color;   
  }
 
  public void setX(int x) {
   this.x = x;
  }
 
  public void setY(int y) {
   this.y = y;
  }
 
  public void setRadius(int radius) {
   this.radius = radius;
  }
 
  @Override
  public void draw() {
   System.out.println("Circle: Draw() [Color : " + color 
     +", x : " + x +", y :" + y +", radius :" + radius);
  }
}
ステップ3
与えられた情報に基づくエンティティクラスのオブジェクトを生成する工場を作成します。

import java.util.HashMap;
 
public class ShapeFactory {
  private static final HashMap<String, Shape> circleMap = new HashMap<>();
 
  public static Shape getCircle(String color) {
   Circle circle = (Circle)circleMap.get(color);
 
   if(circle == null) {
     circle = new Circle(color);
     circleMap.put(color, circle);
     System.out.println("Creating circle of color : " + color);
   }
   return circle;
  }
}
ステップ4
この工場を利用して、色情報を伝達することにより、実体類のオブジェクトを取得する。

public class FlyweightPatternDemo {
  private static final String colors[] = 
   { "Red", "Green", "Blue", "White", "Black" };
  public static void main(String[] args) {
 
   for(int i=0; i < 20; ++i) {
     Circle circle = 
      (Circle)ShapeFactory.getCircle(getRandomColor());
     circle.setX(getRandomX());
     circle.setY(getRandomY());
     circle.setRadius(100);
     circle.draw();
   }
  }
  private static String getRandomColor() {
   return colors[(int)(Math.random()*colors.length)];
  }
  private static int getRandomX() {
   return (int)(Math.random()*100 );
  }
  private static int getRandomY() {
   return (int)(Math.random()*100);
  }
}
ステップ5
プログラムを実行し、結果を出力します。
Creating circule ofカラー:Black
Circule:Draw()[Color:Black,x:36,y:71,radius:100
Creating circele ofカラー:Green
Circule:Draw()[Color:Green,x:27,y:27,radius:100
Creating circele ofカラー:White
Circule:Draw()[Color:White,x:64,y:10,radius:100
Creating circule ofカラー:Red
Circule:Draw()[Color:Red,x:15,y:44,radius:100
Circule:Draw()[Color:Green,x:19,y:10,radius:100
Circule:Draw()[Color:Green,x:94,y:32,radius:100
Circule:Draw()[Color:White,x:69,y:98,radius:100
Creating circule ofカラー:Blue
Circule:Draw()[Color:Blue,x:13,y:4,radius:100
Circule:Draw()[Color:Green,x:21,y:21,radius:100
Circule:Draw()[Color:Blue,x:55,y:86,radius:100
Circule:Draw()[Color:White,x:90,y:70,radius:100
Circule:Draw()[Color:Green,x:78,y:3,radius:100
Circule:Draw()[Color:Green,x:64,y:89,radius:100
Circule:Draw()[Color:Blue,x:3,y:91,radius:100
Circule:Draw()[Color:Blue,x:62,y:82,radius:100
Circule:Draw()[Color:Green,x:97,y:61,radius:100
Circule:Draw()[Color:Green,x:86,y:12,radius:100
Circule:Draw()[Color:Green,x:38,y:93,radius:100
Circule:Draw()[Color:Red,x:76,y:82,radius:100
Circule:Draw()[Color:Blue,x:95,y:82,radius:100
以上はJAVA設計モードの享元モードの詳細を述べました。JAVA享元モデルに関する資料は他の関連記事に注目してください。