Go デザイン パターンのフライウェイト パターン

Yuxian: CSDN コンテンツ パートナー、CSDN の新しいスター メンター、51CTO (トップ セレブ + エキスパート ブロガー)、github オープン ソース愛好家 (ゴーゼロ ソース コードの二次開発、ゲーム バックエンド アーキテクチャ https://github.com/Peakchen)

 

フライウェイト パターンの原理の詳細な説明:
フライウェイト パターンは、多数のきめの細かいオブジェクトの共有を効果的にサポートするために使用される構造設計パターンです。フライウェイト モードでは、オブジェクトを共有することでメモリ使用量が削減され、パフォーマンスが向上します。

Flyweight パターンの中核となる考え方は、オブジェクトを共有可能な内部状態 (Intrinsic State) と共有不可能な外部状態 (Extrinsic State) に分割することです。内部状態はオブジェクトの固定部分であり、複数のオブジェクトで共有できます。外部状態はオブジェクトの変化する部分であり、各オブジェクトは独自の外部状態を持ちます。

フライウェイト パターンの鍵となるのは共有オブジェクトです。新しいオブジェクトを作成する必要がある場合、同じ内部状態を持つオブジェクトがすでに存在するかどうかが最初にチェックされます。存在する場合は、既存のオブジェクトを直接返します。存在しない場合は、新しいオブジェクトを作成し、後で使用できるように共有プールに追加します。

Flyweight パターンはオブジェクトを共有することで、特に多数の同様のオブジェクトが必要な場合にメモリ使用量を大幅に削減できます。これは、きめ細かいオブジェクトを多数作成する必要があり、オブジェクト間で多くの状態が共有される状況に適しています。

基礎となる構造図:
以下は、Flyweight モードの古典的な構造図です。

+----------------------------+
|          Client            |
+----------------------------+
| - externalState          |
| + Operation()               |
+----------------------------+

        ^
        |
        |
        |
        |
        v

+----------------------------+
|         Flyweight         |
+----------------------------+
| + Operation(externalState) |
+----------------------------+

        ^
        |
        |
        |
        |
        v

+----------------------------+
|    ConcreteFlyweight  |
+----------------------------+
| + Operation(externalState) |
+----------------------------+

上の構造図では、 メソッドを呼び出してフライウェイト オブジェクトを操作するのClient はクライアントです 。Operation()

Flyweight これは、Flyweight オブジェクトを操作するためのメソッドを定義する Flyweight インターフェイスです。

ConcreteFlyweight これは、 Operation() フライウェイト インターフェイスのメソッドを実装し、内部状態を含む特定のフライウェイトです。

シナリオの説明:
フライウェイト モードは次のシナリオに適用できます。

  1. Flyweight パターンは、多数のきめの細かいオブジェクトを作成する必要があり、これらのオブジェクトが状態の一部またはすべてを共有できる場合に使用できます。オブジェクトを共有すると、メモリ使用量が削減され、パフォーマンスが向上します。
  2. Flyweight パターンは、オブジェクトの状態のほとんどを外部状態で置き換えることができる場合に使用できます。外部状態は実行時に動的に flyweight オブジェクトに渡すことができ、同じ内部状態を持つ多数のオブジェクトの作成を回避できます。

コード例の実装:
以下は、Go 言語で実装された Flyweight モードの例です。

package main

import "fmt"

// Flyweight 享元接口
type Flyweight interface {
	Operation(externalState string)
}

// ConcreteFlyweight 具体享元
type ConcreteFlyweight struct {
	internalState string
}

// Operation 操作享元对象
func (f *ConcreteFlyweight) Operation(externalState string) {
	fmt.Printf("Internal state: %s, External state: %s\n", f.internalState, externalState)
}

// FlyweightFactory 享元工厂
type FlyweightFactory struct {
	flyweights map[string]Flyweight
}

// GetFlyweight 获取享元对象
func (ff *FlyweightFactory) GetFlyweight(key string) Flyweight {
	if flyweight, ok := ff.flyweights[key]; ok {
		return flyweight
	}

	flyweight := &ConcreteFlyweight{internalState: key}
	ff.flyweights[key] = flyweight
	return flyweight
}

func main() {
	factory := &FlyweightFactory{
		flyweights: make(map[string]Flyweight),
	}

	flyweight1 := factory.GetFlyweight("key1")
	flyweight1.Operation("state1")

	flyweight2 := factory.GetFlyweight("key2")
	flyweight2.Operation("state2")

	flyweight3 := factory.GetFlyweight("key1")
	flyweight3.Operation("state3")
}

上の例では、フライウェイト インターフェイス ( Flyweight) と具体的なフライウェイト ( ConcreteFlyweight) を定義しました。Flyweight インターフェイスは Flyweight オブジェクトを操作するためのメソッドを定義し、特定の Flyweight はこのインターフェイスを実装し、内部状態を含みます。フライウェイト ファクトリ ( FlyweightFactory) は、フライウェイト オブジェクトの作成と管理を担当します。

この関数では main 、flyweight ファクトリを通じて flyweight オブジェクトを取得し、その Operation メソッドを呼び出してオブジェクトを操作します。同じ内部状態が得られた場合、ファクトリは同じフライウェイト オブジェクトを返し、オブジェクトの共有を実現することに注意してください。

ドキュメントへのリンク:
Flyweight パターンに関する参考資料へのリンクをいくつか示します。

  • デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素 (「デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの基礎」) - GoF (Gang of Four) 書籍:リンク
  • フライウェイト デザイン パターン - GeeksforGeeks: 链接
  • フライウェイト デザイン パターン - チュートリアルポイント: リンク
  • Flyweight デザイン パターン - リファクタリングの達人: リンク

現在使用されている製品:
Flyweight パターンは一般的に使用されるデザイン パターンであり、多くのソフトウェアやフレームワークで使用されています。Flyweight パターンを使用する製品とツールの例をいくつか示します。

  1. Java のクラスString:Stringクラスは不変であり、同じ値を持つ複数の文字列が作成されると、それらは文字列定数プール内の同じオブジェクトを共有します。
  2. データベース接続プール: データベース接続プールでは、接続オブジェクトは重量のあるリソースです。エンジョイ モードを使用すると、接続オブジェクトを共有して再利用できるため、接続の作成と破棄のオーバーヘッドが軽減されます。
  3. グラフィックス ライブラリとゲーム エンジン: グラフィックス ライブラリとゲーム エンジンでは、グラフィックス オブジェクトとパーティクル オブジェクトは通常きめ細かく、フライウェイト モードを使用してこれらのオブジェクトを共有および再利用することでパフォーマンスを向上させることができます。

おすすめ

転載: blog.csdn.net/feng1790291543/article/details/132159630