🐓

Prototype

2023/09/10に公開

Prototype パターンは、既存のオブジェクトをコピーして新しいオブジェクトを作成するデザインパターンです。これはオブジェクトを「クローン」することで新しいインスタンスを作成します。このパターンは、新しいインスタンスを作成するコストが高い場合や、クラスから直接インスタンスを作成することが不適切または不可能な場合に特に有用です。

主要な構成要素:

  1. Prototype (プロトタイプ): クローンをサポートするインターフェースまたは抽象クラス。
  2. ConcretePrototype (具体的なプロトタイプ): Prototype インターフェースを実装するクラス。このクラスのインスタンスをクローンして新しいオブジェクトを作成します。

例:

想像してみてください。シェイプという抽象クラスがあり、サークルや四角といった具体的なシェイプが存在する場合。

  1. Prototype:

    from abc import ABC, abstractmethod
    
    class Shape(ABC):
        def __init__(self):
            self.id = None
    
        @abstractmethod
        def draw(self):
            pass
    
        def clone(self):
            return copy.deepcopy(self)
    
    
  2. ConcretePrototype:

    import copy
    
    class Circle(Shape):
        def draw(self):
            return "Drawing a circle!"
    
    class Rectangle(Shape):
        def draw(self):
            return "Drawing a rectangle!"
    
    

使用例:

circle1 = Circle()
circle1.id = "1"
circle2 = circle1.clone()  # circle2 は circle1 のコピーです。
circle2.id = "2"

print(circle1.draw())  # "Drawing a circle!"
print(circle2.draw())  # "Drawing a circle!"

利点:

  1. パフォーマンス: 新しいオブジェクトの生成よりもオブジェクトのクローニングが効率的な場合に、Prototype パターンは特に有用です。
  2. 柔軟性: システム内で利用可能なオブジェクトの種類と数をランタイムに指定する柔軟性が提供されます。
  3. 動的なクラスの拡張: クローンされるオブジェクトがどのクラスに属しているかに関係なく、プロトタイプをクローンできます。

Prototype パターンは、オブジェクトの動的な生成やインスタンスの生成コストが高い場合、または特定の状態でオブジェクトを事前に初期化して再利用する場合など、様々なシチュエーションで役立ちます。

Discussion