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) をご覧ください。