フライ級-Flyweightパターン

あまりにも多くのオブジェクトが実行時にソフトウェアシステムによって生成された場合には、システムパフォーマンスの低下やその他の問題をもたらし、高いランニングコストにつながります。別のオブジェクトとの各文字が表現する場合たとえば、多くの繰り返し文字は、テキスト文字列であり、その後、どのように我々はシステム内に存在する同一または類似のオブジェクトの多くを避けるしようとしている、より多くのメモリスペースを取るだろう、クライアントプログラムに影響を与えることなく、オブジェクト指向の方法を介してこれらのオブジェクトを操作?生まれてこの種の問題を解決するためにFlyweightパターン。フライ級の技術を共有することにより、再利用し、同一または類似の目的を達成するため、対応する論理オブジェクトのそれぞれに登場するキャラクタが、しかし、彼らは同じ物理的な要素を文字で表示することができ、共有オブジェクトを共有してくださいました異なる場所のストリングは、同一の参照文字はフライ級モードでは、同じオブジェクトインスタンスを参照し、ローカルプールに格納されているこれらの共有オブジェクトの例は、フライ級(フライ級プール)と呼ばれます。私たちは、必要に応じてフライ級、フライ級はその後、プールから削除プールに入れて、それぞれがメタオブジェクトを楽しむためのさまざまなキャラクターを作成することができます。

メタスキーマで定義された特性をお楽しみください。

定義されたフライ級(フライ級)モード:使用が効果的な再利用にきめの細かいオブジェクトの多くをサポートするために共有します。それは劇的にすることにより、システムリソースの使用率を向上させること、オーバーヘッドの同種の多数を避けるために作成する必要があるオブジェクトの数を減らすために、既存のゴムを共有することです。

主な利点フライ級パターンがある:限りオブジェクトはそれによってきめ細かいオブジェクトをもたらすために、システム・メモリ内の圧力を低下させる、システム内のオブジェクトの数を減らすコピーを保存するのと同じ。

主な欠点は以下のとおりです。

  1. オブジェクトを作成するために共有することができるプログラムの複雑さを増加させる外部共有状態の一部である必要はありません。
  2. 実行している時間が少し長くなるような外部の状況を読んでフライ。

フライ級のアーキテクチャと実装

二つの状態モード、以下のフライ級:

  1. 内部状態、その部分は、環境の変化が変更されたと共有することはないであろう。
  2. 外部状態は、一部を共有していない環境の変化の変化を指します。達成共有アプリケーションは、この2つの状態の必需品メタスキーマ、および外部の外部状態を区別することです。次の基本的な構造と実装を分析します。

1.構造モデル

主な役割のFlyweightパターンは以下の通りです。

  1. 抽象文字フライ(フライ):フライ全てコンクリートベースクラス、具体的なフライメソッドによって渡されたパラメータの形で共通インタフェース仕様、非フライ級外部状態を実装する必要があります。
  2. 特定のフライ級(コンクリートフライ級)の役割:指定された役割を楽しむための抽象インタフェース。
  3. 非フライ級(共有不可フライ級)キャスト:外部の状態が共有されていない、それはパラメータの形式で詳細フライ級相関を注入します。
  4. フライ級の工場(フライ級ファクトリー)役割:フライ級役割の作成と管理を担当します。クライアントは、お客様にご利用いただけますがあれば、オブジェクトの要件を満たすようにするかどうかが、オブジェクトフライ級オブジェクト、フライ級フライ級工場検査システムを要求すると、それが存在しない場合は、新しいフライ級オブジェクトを作成します。


図1は、フライ級の構成図です。図UnsharedConcreteFlyweight非共有外部状態情報に関する情報が含まれているチョン・ロールであり、操作のフライメソッドを含む抽象フライ級の役割、(UnsharedConcreteFlyweight状態)フライ級、非フライ級外部状態パラメータこの方法で渡された形; ConcreteFlyweight特定フライ級の役割は、抽象的なフライ級のインターフェースを実装し、キーワードキーを含んでいます。FlyweightFactoryフライ級の工場が死亡キーワードキーは、特定のフライ級を管理するための役割であり、共有することで、顧客の役割を特定のフライ級とコンクリートの関連メソッドへのアクセスのためのフライ級元工場。
 

図のフライ級構造。
図1は構成図フライ級であります

実現の2モード

Flyweightパターンコードは次のとおりです。

package flyweight;
import java.util.HashMap;
public class FlyweightPattern
{
    public static void main(String[] args)
    {
        FlyweightFactory factory=new FlyweightFactory();
        Flyweight f01=factory.getFlyweight("a");
        Flyweight f02=factory.getFlyweight("a");
        Flyweight f03=factory.getFlyweight("a");
        Flyweight f11=factory.getFlyweight("b");
        Flyweight f12=factory.getFlyweight("b");       
        f01.operation(new UnsharedConcreteFlyweight("第1次调用a。"));       
        f02.operation(new UnsharedConcreteFlyweight("第2次调用a。"));       
        f03.operation(new UnsharedConcreteFlyweight("第3次调用a。"));       
        f11.operation(new UnsharedConcreteFlyweight("第1次调用b。"));       
        f12.operation(new UnsharedConcreteFlyweight("第2次调用b。"));
    }
}
//非享元角色
class UnsharedConcreteFlyweight
{
    private String info;
    UnsharedConcreteFlyweight(String info)
    {
        this.info=info;
    }
    public String getInfo()
    {
        return info;
    }
    public void setInfo(String info)
    {
        this.info=info;
    }
}
//抽象享元角色
interface Flyweight
{
    public void operation(UnsharedConcreteFlyweight state);
}
//具体享元角色
class ConcreteFlyweight implements Flyweight
{
    private String key;
    ConcreteFlyweight(String key)
    {
        this.key=key;
        System.out.println("具体享元"+key+"被创建!");
    }
    public void operation(UnsharedConcreteFlyweight outState)
    {
        System.out.print("具体享元"+key+"被调用,");
        System.out.println("非享元信息是:"+outState.getInfo());
    }
}
//享元工厂角色
class FlyweightFactory
{
    private HashMap<String, Flyweight> flyweights=new HashMap<String, Flyweight>();
    public Flyweight getFlyweight(String key)
    {
        Flyweight flyweight=(Flyweight)flyweights.get(key);
        if(flyweight!=null)
        {
            System.out.println("具体享元"+key+"已经存在,被成功获取!");
        }
        else
        {
            flyweight=new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}


次のようにプログラムの結果は以下のとおりです。

作成された特定のフライ級!
既存の特定のフライ級、首尾よく入手!
既存の特定のフライ級、首尾よく入手!
特定のフライ級Bが作成されます!
すでに存在する特定のフライ級B、成功裏に取得!
第一コール:フライ級は、特定の、非フライ級のメッセージがあると呼ばれます。
第二コール・A:フライ級は、特定の、非フライ級の情報と呼ばれます。
第3回のコールA:フライ級は、特定の、非フライ級の情報と呼ばれます。
第一コールB:Bは、特定のフライ級、フライ級の情報が非であると呼ばれています。
第二コール・B:Bは、特定のフライ級、フライ級の情報が非であると呼ばれています。

メタスキーマ共有アプリケーションの例

バックギャモンのゲームにおいて[適用例1]フライ。

分析:「黒」又は「白」色の複数のピースを含む、331に行くので、より良好なフライを使用します。

この例では片(ChessPieces)クラスは抽象フライ級の役割であり、それはLazi DownPieces(グラフィックG、点PT)メソッドが含まれ;アルビノ(WhitePieces)と黒点(BlackPieces)クラスは、具体的なフライ級の役割であり、それは実装しますZI法;位置Laziを指定ポイントノンフライ級ロール; WeiqiFactoryはArrayListのを通して作品を管理するために、フライ級工場の役割であり、取得したアルビノまたは黒点getChessPieces(文字列型)の方法を提供し、顧客のカテゴリ(チェス盤)グラフィックアセンブリドローフレーム形式を利用ボード、及びのmouseClicked(MouseEventの電子)イベント処理方法、ユーザの選択及び基板に係る白色サブフライ級黒点または植物を得るための方法を達成します。図2は、構成図です。
 

構造図のバックギャモンのゲーム
図2は、構成図のバックギャモンのゲームであります


コードは以下の通りであります:

package flyweight;
import java.util.HashMap;
public class FlyweightPattern
{
    public static void main(String[] args)
    {
        FlyweightFactory factory=new FlyweightFactory();
        Flyweight f01=factory.getFlyweight("a");
        Flyweight f02=factory.getFlyweight("a");
        Flyweight f03=factory.getFlyweight("a");
        Flyweight f11=factory.getFlyweight("b");
        Flyweight f12=factory.getFlyweight("b");       
        f01.operation(new UnsharedConcreteFlyweight("第1次调用a。"));       
        f02.operation(new UnsharedConcreteFlyweight("第2次调用a。"));       
        f03.operation(new UnsharedConcreteFlyweight("第3次调用a。"));       
        f11.operation(new UnsharedConcreteFlyweight("第1次调用b。"));       
        f12.operation(new UnsharedConcreteFlyweight("第2次调用b。"));
    }
}
//非享元角色
class UnsharedConcreteFlyweight
{
    private String info;
    UnsharedConcreteFlyweight(String info)
    {
        this.info=info;
    }
    public String getInfo()
    {
        return info;
    }
    public void setInfo(String info)
    {
        this.info=info;
    }
}
//抽象享元角色
interface Flyweight
{
    public void operation(UnsharedConcreteFlyweight state);
}
//具体享元角色
class ConcreteFlyweight implements Flyweight
{
    private String key;
    ConcreteFlyweight(String key)
    {
        this.key=key;
        System.out.println("具体享元"+key+"被创建!");
    }
    public void operation(UnsharedConcreteFlyweight outState)
    {
        System.out.print("具体享元"+key+"被调用,");
        System.out.println("非享元信息是:"+outState.getInfo());
    }
}
//享元工厂角色
class FlyweightFactory
{
    private HashMap<String, Flyweight> flyweights=new HashMap<String, Flyweight>();
    public Flyweight getFlyweight(String key)
    {
        Flyweight flyweight=(Flyweight)flyweights.get(key);
        if(flyweight!=null)
        {
            System.out.println("具体享元"+key+"已经存在,被成功获取!");
        }
        else
        {
            flyweight=new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}


図3に示すプログラムの結果。

業績のバックギャモンのゲーム
業績3バックギャモンのゲーム

シナリオの元のモードをお楽しみください

フライ級の構造と機能の以前の分析は、それが以下の分析シナリオを適用します。Flyweightパターンは以下のような状況フライ級のためにそう適した、メモリ内のオブジェクトの数を減らすことによって、メモリ空間を節約することです。

  1. オブジェクトの同一または類似の多数がシステムに存在し、これらのオブジェクトはメモリリソースの多くを費やします。
  2. 各グループは、内部状態記憶するようにほとんどのオブジェクトは、異なっていてもよく、内部状態と外部の部分に応じてグループ化することができます。
  3. フライ級フライ級の価値が使用した場合の事例がたくさんあるはずですのでによる追加のメンテナンスフライ級フライ級の必要性へのデータ構造は、保存されています。

拡張のFlyweightパターン

前述したフライ級のパターンでは、図の部分の構造は、典型的には、共有含有していない部分を共有しました。実際の使用では、時々 、ほとんど変化は、すなわち、二つの特別なフライ級の存在:シンプルかつ複雑なフライフライ級は、彼らが簡単に下回っていました。

特定の非共有フライ級クラスが存在しない(1)単純なフライ級は、このフライ級フライ級共有モードの特定のクラスのすべてが、図4に示した構造が可能です。
 

図の簡単な構造でフライ級。
図4の単純なフライ級の構成図


(2)複合フライ級は、いくつかのオブジェクトフライ級フライこれは単にフライ級により得られたオブジェクトのいくつかの組み合わせである、フライ級それらは複雑なオブジェクトです。化合物は、フライ級オブジェクト自体を共有することができないが、それらは再び共有される共有単純な要素オブジェクト、図5に示す構造に分解することができるが。
 

図の複合構造をフライ。
複合フライ級の図5の構成図

おすすめ

転載: blog.csdn.net/yucaixiang/article/details/94394221