ホームページ  >  記事  >  バックエンド開発  >  C++ デザイン パターン フライウェイト パターンの簡単な紹介

C++ デザイン パターン フライウェイト パターンの簡単な紹介

黄舟
黄舟オリジナル
2017-01-17 13:27:001379ブラウズ

Flyweight: 共有テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートします。

4 つの役割クラス:

Flyweight フライウェイト クラス: すべての特定のフライウェイト クラスのスーパー クラスまたはインターフェイス このインターフェイスを通じて、Flyweight は外部状態を受け入れて動作できます。

Flyweight Flyweight ファクトリ クラス: ユーザーが Flyweight を要求すると、FlyweightFactory オブジェクトは作成されたインスタンスを提供するか、(存在しない場合) インスタンスを作成します。

ConcreteFlyweight コンクリート フライウェイト クラス: Flyweight スーパー クラスを継承するか、Flyweight インターフェイスを実装し、内部状態用のストレージ スペースを追加します。

UnSharedConcreteFlyweight は、共有する必要のない特定の Flyweight サブクラスを指し、共有する必要のない Flyweight サブクラスを指します。 Flyweight インターフェイス クラスの共有は可能ですが、共有は必須ではないためです。

モードの実装:

[code]//享元类
class Flyweight{
public:
    virtual void Operation(int extrinsicState){}
};

//具体享元类
class ConcreteFlyweight: public Flyweight{
public:
    virtual void Operation(int extrinsicState)override{
        std::cout << "ConcreteFlyweight: " << extrinsicState << std::endl;
    }
};

//不需共享的Flyweight子类
class UnSharedConcreteFlyweight: public Flyweight{
public:
    virtual void Operation(int extrinsicState){
        std::cout << "UnSharedConcreteFlyweight: " << extrinsicState << std::endl;
    }
};

//享元工厂,用来创建并管理Flyweight对象
class FlyweightFactory{
private:
    std::map<std::string, Flyweight*> flyweights;
public:
    FlyweightFactory(){
        flyweights["X"] = new ConcreteFlyweight;
        flyweights["Y"] = new ConcreteFlyweight;
        flyweights["Z"] = new ConcreteFlyweight;
    }
    Flyweight* GetFlyweight(std::string key){
        return (Flyweight*)flyweights[key];
    }
};

クライアント:

[code]//Client
int main(){
    //外部状态
    int extrinsicState = 22;
    //工厂
    FlyweightFactory *f = new FlyweightFactory;
    Flyweight* fx = f->GetFlyweight("X");
    fx->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 21

    Flyweight* fy = f->GetFlyweight("Y");
    fy->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 20

    Flyweight* fz = f->GetFlyweight("Z");
    fz->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 19

    Flyweight *uf = new UnSharedConcreteFlyweight;  //Output: UnSharedConcreteFlyweight: 18
    uf->Operation(--extrinsicState);

    return 0;
}

Flyweightモードの利点:

アプリケーションが多数のオブジェクトを使用し、これらのオブジェクトの数が多いとストレージのオーバーヘッドが大量に発生する場合は、それを考慮する必要があります。

オブジェクトのほとんどの状態は外部状態を使用できます。オブジェクトの外部状態が削除された場合、多くのオブジェクトのグループを比較的少数の共有オブジェクトに置き換えることができます。この場合、フライウェイト パターンが考慮されます。

上記は C++ デザイン パターンのフライウェイト パターンの簡単な紹介の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。