Java設計モード--享元モード(Flyweight Pattern)

10751 ワード

コンセプト:
享元モード(Flyweight Pattern)はソフトウェア設計モードである.共有オブジェクトを使用して、メモリの使用量をできるだけ減らし、情報をできるだけ多くの類似オブジェクトに共有します.重複するだけで許容できない大量のメモリを使用するのに適しています.通常、物の一部の状態は共有できます.一般的な方法は、外部データ構造に配置し、必要に応じて享元に渡すことです.
クラシックアプリケーションシーン:
JavaのStringタイプの特性を復習します:Stringタイプのオブジェクトはいったん創造されると変えられません;2つのStringオブジェクトに同じ内容が含まれている場合、JVMは2つの異なるオブジェクト参照に対応する1つのStringオブジェクトのみを作成します.2つの特性を検証しましょう
まず、次の2つ目の特性を検証します.
public class TestPattern {
       public static void main(String[] args){
           String n = "Java design";
           String m = "Java design";
           System.out.println(n==m);
           m=m+" pattern";
           System.out.println(n==m);

       }
}
このコードはn=mがtrueであることを示します.これは、JVMでnとmの2つが同じStringオブジェクトを参照していることを示します.その後、システム出力の前に1行のコードを追加します.m=m+「pattern」;」というように、n=mの結果がfalseとなり、先ほど2つのオブジェクトが参照されたオブジェクトとは異なります.なぜなら、実行後に文を追加すると、mは参照を変更するオブジェクトではなく、新しく作成されたStringオブジェクトを指します.
JAVA StringタイプのデザインはNマルチStringオブジェクトを作成する際に発生する不要なリソースロスを回避しており,メタモードアプリケーションの例と言えるが,以下では自分のプログラムでメタモードをどのように使用するかを見る.
実装:
ユーティリティーモードでは、さまざまなオブジェクトが生成されるため、Flyweight(ユーティリティー)モードではFactoryモードがよく発生します.Flyweightの内部状態は共有に使用され、Flyweight factoryはオブジェクトストレージプール(Flyweight Pool)のメンテナンスを担当します.内部状態のオブジェクトを格納します.Flyweightモードはプログラムの効率と性能を向上させるモードで、プログラムの実行速度を大幅に速めます.アプリケーションの場合が多いです.
ケース:
プロジェクトは都市名、上級管轄区などを含む都市地域データを構築する必要がある.
Areaクラス:
public abstract class Area {

    private String name;

    public abstract void displayName();

    public abstract Area setAdminArea(Area area);

    public abstract Area getAdminArea();

    public Area setName(String areaname) {
        name = areaname;
        return this;
    }

    public String getName() {
        return name;
    }
}
 
  
City  :
 
  
public class City extends Area {

    private Area adminArea;

    @Override
    public void displayName() {
        System.out.println(getName());
    }

    public Area getAdminArea() {
        return adminArea;
    }

    @Override
    public Area setAdminArea(Area area) {
        this.adminArea = area;
        return this;
    }
}
 
  
AdminArea  :
 
  
 
  
public class AdminArea extends Area {

    public AdminArea(String areaname) {
        super();
        setName(areaname);
    }

    @Override
    public void displayName() {
        System.out.println(getName());
    }

    @Override
    public Area setAdminArea(Area area) {
        return null;
    }

    @Override
    public Area getAdminArea() {
        return null;
    }
}
AdminAreaFactory    :
 
  
public class AdminAreaFactory {
    private static Hashtable hashtable = new Hashtable();

    public static Area produce(String name){
        if(null==name){
            return null;
        }
        Area area = (Area) hashtable.get(name);
        if(null==area){
            area = new AdminArea(name);
            hashtable.put(name,area);
        }
        return area;
    }

    public static int getObjectCount(){
        return hashtable.size();
    }
}

テストクラス:
public class WorkClass {
    public void test() {
        Area city0 = new City().setName("hangzhou")
                .setAdminArea(AdminAreaFactory.produce("zhejiang"));
        Area city1 = new City().setName("suzhou")
                .setAdminArea(AdminAreaFactory.produce("jiangsu"));
        Area city2 = new City().setName("huzhou")
                .setAdminArea(AdminAreaFactory.produce("zhejiang"));
        Area city3 = new City().setName("nanjing")
                .setAdminArea(AdminAreaFactory.produce("jiangsu"));
        Area city4 = new City().setName("ninbo")
                .setAdminArea(AdminAreaFactory.produce("zhejiang"));

        List list = new ArrayList();
        list.add (city0);
        list.add (city1);
        list.add (city2);
        list.add (city3);
        list.add (city4);
        for (int i = 0; i < list.size(); i++) {
            Area city = list.get(i);
            city.getAdminArea().displayName();
            city.displayName();
        }
        System.out.println(String.format("AdminAreaFactory.getObjectCount()=%s", AdminAreaFactory.getObjectCount()));
    }
}
 
  
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: zhejiang
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: hangzhou
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: jiangsu
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: suzhou
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: zhejiang
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: huzhou
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: jiangsu
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: nanjing
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: zhejiang
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: ninbo
06-21 11:57:12.637 30394-30394/com.example.qinghua_liu.myapplication I/System.out: AdminAreaFactory.getObjectCount()=2
  AdminAreaFactory   ,   AdminArea   ,             ,       。