🐸

Flyweight

2023/09/10に公開

Flyweight パターンは、大量の類似したオブジェクトを効率的に共有することで、メモリの使用を最適化するデザインパターンです。このパターンは、オブジェクトの共通のデータを外部のデータ構造に保持し、オブジェクト自体はそのデータへの参照のみを持つことで、メモリ使用量を削減します。

主要な構成要素:

  1. Flyweight (フライウェイト): すべての具象フライウェイトが共有するインターフェースや抽象クラス。
  2. ConcreteFlyweight (具象フライウェイト): 共有される具体的なオブジェクト。
  3. FlyweightFactory (フライウェイト工場): 既存のフライウェイトオブジェクトを作成または取得するためのメカニズムを提供するクラス。

例:

文字や行を描画するアプリケーションを考えてみましょう。各文字は異なるフォントやサイズで表示されるかもしれませんが、文字自体のデータ(例:'A', 'B', 'C'など)は変わらないので共有できます。

  1. Flyweight:

    class Character:
        def __init__(self, char):
            self.char = char
    
        def display(self, font, size):
            print(f"Displaying {self.char} in {font} with size {size}")
    
    
  2. FlyweightFactory:

    class CharacterFactory:
        def __init__(self):
            self._characters = {}
    
        def get_character(self, char):
            if char not in self._characters:
                self._characters[char] = Character(char)
            return self._characters[char]
    
    

使用方法:

    factory = CharacterFactory()

    char_a = factory.get_character('A')
    char_a.display("Arial", 12)

    char_b = factory.get_character('B')
    char_b.display("Verdana", 14)

    # 同じオブジェクトを再利用
    another_char_a = factory.get_character('A')
    another_char_a.display("Times New Roman", 16)

利点:

  1. メモリの節約: 類似したオブジェクトの共通のデータ部分を共有することで、メモリの使用を大幅に削減できます。
  2. 効率: オブジェクトの作成や廃棄のオーバーヘッドを減らすことができます。

Flyweight パターンは、大量の類似したオブジェクトを効率的に扱いたい場合、特にゲームやグラフィックスのアプリケーションなどの環境でよく利用されます。

Discussion