KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

Python基礎 オブジェクト指向17(Flyweight) 構造に関するデザインパターン

登録日 :2025/11/15 11:14
カテゴリ :Python基礎

Flyweight

ボクシングのフライ級を意味する。
インスタンス化されたオブジェクトを効率よく共有することで、リソースの消費を抑えるパターン

メモリの使用量を軽くする=>Flyweight

環境や状況によって変化しない情報のみ共有する

構成要素

Flyweight

  • 共有されるオブジェクト
  • 環境や状況によって変化しない情報のみを持たせる

FlyweightFactory

  • 内部にFlyweight型のインスタンスを保持
  • Flyweightが要求された場合に、既にインスタンスがあればそのインスタンスを返却し、なければ新たに生成する。

オブジェクト指向的要素

特になし

メリット・デメリット

メリット

  • 生成されるオブジェクトの数を抑える
  • リソースの消費を抑える

デメリット

  • コードが複雑化し、理解しずらくなる
  • 共有されているオブジェクトの変更により、想定外のバグを生む可能性がある

使い所

  • 同一のオブジェクトを大量に使用する必要がある場合
  • インスタンス生成によるリソースの消費を抑えたい場合
     メモリ
     インスタンス生成のための時間(オーバーヘッド)

サンプル

文字のスタンプを使用する例

class Stamp(object):
    """Flyweight"""
    def __init__(self, _char: str):
        self.__char = _char

    def print_char(self):
        print(self.__char)


class StampFactory(object):
    """Flyweight Factory"""
    def __init__(self):
        self.__pool = {}

    def get_stamp(self, _char: str) -> Stamp:
        stamp = self.__pool.get(_char)

        if stamp:
            return stamp
        new_stamp = Stamp(_char)
        self.__pool[_char] = new_stamp
        return new_stamp

    def get_pool(self):
        return self.__pool


if __name__ == '__main__':
    factory = StampFactory()
    stamp1 = factory.get_stamp("F")
    stamp2 = factory.get_stamp("L")
    stamp3 = factory.get_stamp("Y")
    stamp4 = factory.get_stamp("F")
    stamp5 = factory.get_stamp("Y")

    stamp1.print_char()
    stamp2.print_char()
    stamp3.print_char()
    stamp4.print_char()
    stamp5.print_char()

    print(factory.get_pool())