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())