フライウェイトパターン(Flyweight Pattern)は、オブジェクトの共有を通じてメモリの使用量を削減するための構造的デザインパターンです。このパターンは、多くの類似したオブジェクトを生成する場合に特に効果的です。フライウェイトパターンを使用することで、オブジェクトの状態を外部に分離し、同じ種類のオブジェクトを必要に応じて共有することができます。
フライウェイトパターンには、以下の3つの主要なコンポーネントがあります。
以下に、フライウェイトパターンを使ったPythonのサンプルコードを示します。この例では、同じ種類のオブジェクト(ここでは「文字」)を共有することで、メモリの使用量を削減します。
まず、フライウェイトのインターフェースを作成します。このインターフェースでは、クライアントがオブジェクトを利用するためのメソッドを定義します。
class Character:
def display(self, font_size):
pass
次に、具体的なフライウェイトクラスを実装します。このクラスは、共有可能な状態(ここでは文字)を持ちます。
class ConcreteCharacter(Character):
def __init__(self, character):
self.character = character
def display(self, font_size):
print(f"Character: {self.character}, Font Size: {font_size}")
フライウェイトファクトリを実装し、オブジェクトの管理と共有を行います。
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]
最後に、クライアントコードを実装して、フライウェイトパターンの機能を利用します。
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)
display
メソッドを定義しています。display
メソッドでその文字とフォントサイズを表示します。get_character
メソッドを通じて、必要な文字を取得します。既に存在する文字があれば、それを返し、新しい文字の場合は新たにインスタンスを作成します。CharacterFactory
を使って文字を取得し、それを表示しています。これにより、同じ文字のインスタンスが再利用されることがわかります。フライウェイトパターンは、オブジェクトの共有を通じてメモリの使用量を削減するために非常に効果的です。このパターンを適用することで、特に多くの同じオブジェクトが必要な場合に、アプリケーションのパフォーマンスを向上させることができます。