Section 8 / 10
フライウェイトパターン
フライウェイトパターン(Flyweight Pattern)は、オブジェクトの共有を通じてメモリの使用量を削減するための構造的デザインパターンです。このパターンは、多くの類似したオブジェクトを生成する場合に特に効果的です。フライウェイトパターンを使用することで、オブジェクトの状態を外部に分離し、同じ種類のオブジェクトを必要に応じて共有することができます。
フライウェイトパターンの基本概念
フライウェイトパターンには、以下の3つの主要なコンポーネントがあります。
- フライウェイト(Flyweight): シェア可能なオブジェクトのインターフェースを定義します。
- 具体的フライウェイト(ConcreteFlyweight): フライウェイトインターフェースを実装し、共有可能な状態を持ちます。
- フライウェイトファクトリ(FlyweightFactory): フライウェイトインスタンスを管理し、必要に応じてインスタンスを提供します。
フライウェイトパターンの実装
以下に、フライウェイトパターンを使ったPythonのサンプルコードを示します。この例では、同じ種類のオブジェクト(ここでは「文字」)を共有することで、メモリの使用量を削減します。
ステップ1: フライウェイトインターフェースを定義する
まず、フライウェイトのインターフェースを作成します。このインターフェースでは、クライアントがオブジェクトを利用するためのメソッドを定義します。
class Character:
def display(self, font_size):
pass
ステップ2: 具体的フライウェイトを実装する
次に、具体的なフライウェイトクラスを実装します。このクラスは、共有可能な状態(ここでは文字)を持ちます。
class ConcreteCharacter(Character):
def __init__(self, character):
self.character = character
def display(self, font_size):
print(f"Character: {self.character}, Font Size: {font_size}")
ステップ3: フライウェイトファクトリを作成する
フライウェイトファクトリを実装し、オブジェクトの管理と共有を行います。
class CharacterFactory:
def __init__(self):
self._characters = {}
def get_character(self, character):
if character not in self._characters:
self._characters[character] = ConcreteCharacter(character)
return self._characters[character]
ステップ4: クライアントコードを実装する
最後に、クライアントコードを実装して、フライウェイトパターンの機能を利用します。
if __name__ == "__main__":
factory = CharacterFactory()
# 文字を表示する
characters = ['A', 'B', 'C', 'A', 'B', 'C']
font_size = 12
for char in characters:
character = factory.get_character(char)
character.display(font_size)
コードの解説
- Character クラス: フライウェイトのインターフェースで、
displayメソッドを定義しています。 - ConcreteCharacter クラス: 特定の文字を表すフライウェイトの実装です。コンストラクタで文字を受け取り、
displayメソッドでその文字とフォントサイズを表示します。 - CharacterFactory クラス: フライウェイトインスタンスを管理するファクトリクラスです。
get_characterメソッドを通じて、必要な文字を取得します。既に存在する文字があれば、それを返し、新しい文字の場合は新たにインスタンスを作成します。 - クライアントコード:
CharacterFactoryを使って文字を取得し、それを表示しています。これにより、同じ文字のインスタンスが再利用されることがわかります。
まとめ
フライウェイトパターンは、オブジェクトの共有を通じてメモリの使用量を削減するために非常に効果的です。このパターンを適用することで、特に多くの同じオブジェクトが必要な場合に、アプリケーションのパフォーマンスを向上させることができます。