🐦

Factory Method

2023/09/10に公開

Factory Method パターンは、オブジェクトを生成するインターフェースを定義するが、具体的なクラスのインスタンス化はサブクラスに任せるデザインパターンです。これにより、クライアントは具体的なクラスを知ることなくオブジェクトを生成することができます。

主要な構成要素:

  1. Product (製品): 生成されるオブジェクトのインターフェースまたは抽象クラス。
  2. ConcreteProduct (具体的な製品): Product インターフェースを実装する具体的なクラス。
  3. Creator (作成者): Factory Method を持つ抽象クラスやインターフェース。
  4. ConcreteCreator (具体的な作成者): Factory Method をオーバーライドして、ConcreteProduct のインスタンスを返すクラス。

例:

想像してみてください。動物のオブジェクトを作成するシステムがあり、動物の種類ごとに異なる具体的なオブジェクトを生成する必要がある場合。

  1. Product:

    from abc import ABC
    
    class Animal(ABC):
        def speak(self):
            pass
    
    
  2. ConcreteProduct:

    class Dog(Animal):
        def speak(self):
            return "Woof!"
    
    class Cat(Animal):
        def speak(self):
            return "Meow!"
    
    
  3. Creator:

    from abc import ABC, abstractmethod
    
    class AnimalFactory(ABC):
        @abstractmethod
        def create_animal(self):
            pass
    
    
  4. ConcreteCreator:

    class DogFactory(AnimalFactory):
        def create_animal(self):
            return Dog()
    
    class CatFactory(AnimalFactory):
        def create_animal(self):
            return Cat()
    
    

利点:

  1. 柔軟性: Factory Method は、新しい種類のオブジェクトを追加する際の柔軟性を提供します。新しい種類のオブジェクトを追加する場合、新しい具体的なファクトリークラスを作成するだけでよく、既存のコードは変更する必要がありません。
  2. コードの分離: クライアントコードは具体的なオブジェクトのクラスを知る必要がないため、コードの依存性が低減し、コードの分離と再利用が容易になります。

Factory Method パターンは、システムが新しい種類のオブジェクトを簡単に追加できるようにするため、またクライアントと具体的なクラスの間の疎結合を保持するために使用されます。

Discussion