🐔

Abstract Factory

2023/09/10に公開

Abstract Factory パターンは、関連するオブジェクトのファミリを作成するインターフェースを提供するデザインパターンです。このパターンでは、具体的なクラスの生成に関する責任が具体的なファクトリクラスに委ねられます。この方法により、システムは具体的なクラスを知らずに、関連するオブジェクトのファミリを生成することができます。

主要な構成要素:

  1. Abstract Factory (抽象ファクトリ): 一連の関連するオブジェクトを作成するためのメソッドを定義するインターフェース。
  2. Concrete Factory (具体的なファクトリ): Abstract Factory のメソッドをオーバーライドして、特定のオブジェクトを生成する。
  3. Abstract Product (抽象製品): ファクトリで生成されるオブジェクトのインターフェース。
  4. Concrete Product (具体的な製品): Abstract Product インターフェースを実装する具体的なオブジェクト。

例:

想像してみてください。異なるスタイルのボタンやチェックボックスを持つGUIライブラリがあり、それぞれのスタイルごとに異なる具体的なオブジェクトを生成する必要がある場合。

  1. Abstract Product:

    from abc import ABC
    
    class Button(ABC):
        def click(self):
            pass
    
    class CheckBox(ABC):
        def check(self):
            pass
    
    
  2. Concrete Product:

    class DarkButton(Button):
        def click(self):
            return "Dark button clicked!"
    
    class LightButton(Button):
        def click(self):
            return "Light button clicked!"
    
    class DarkCheckBox(CheckBox):
        def check(self):
            return "Dark checkbox checked!"
    
    class LightCheckBox(CheckBox):
        def check(self):
            return "Light checkbox checked!"
    
    
  3. Abstract Factory:

    from abc import ABC, abstractmethod
    
    class GUIFactory(ABC):
        @abstractmethod
        def create_button(self):
            pass
    
        @abstractmethod
        def create_checkbox(self):
            pass
    
    
  4. Concrete Factory:

    class DarkThemeFactory(GUIFactory):
        def create_button(self):
            return DarkButton()
    
        def create_checkbox(self):
            return DarkCheckBox()
    
    class LightThemeFactory(GUIFactory):
        def create_button(self):
            return LightButton()
    
        def create_checkbox(self):
            return LightCheckBox()
    
    

利点:

  1. 製品の組み合わせ: 一連の関連するオブジェクトのファミリを簡単に交換することができます。例えば、GUIテーマを切り替える場合など。
  2. 高い結合性: 各ファクトリが一連の関連する製品を生成することで、一貫性と互換性を保つことができます。
  3. 拡張性: 新しい製品のファミリを追加するのは容易で、既存のクライアントコードに影響を与えることなく行えます。

Abstract Factory パターンは、関連するオブジェクトのセットやテーマのような製品のファミリを提供する必要がある場合に特に役立ちます。

Discussion