<一覧に戻る

抽象ファクトリーパターン

抽象ファクトリーパターンは、関連するオブジェクトのグループを生成するためのインターフェースを提供するデザインパターンです。このパターンを利用することで、クライアントコードは具体的なクラスに依存せず、オブジェクトの生成を柔軟に行うことができます。

抽象ファクトリーパターンの目的

  • 関連するオブジェクトのグループを生成する:複数の関連したオブジェクトを一括で生成したい場合に便利です。
  • クライアントコードの柔軟性:具体的なクラスに依存せず、インターフェースに基づいてオブジェクトを生成することで、コードの保守性が向上します。
  • 異なるファミリーのオブジェクトを簡単に切り替えられる:異なる製品ファミリーを持つ場合でも、同じインターフェースを通じてオブジェクトを扱えます。

サンプルコード

ここでは、抽象ファクトリーパターンを使って、異なる種類の家具(テーブルと椅子)を生成する方法を示します。具体的には、現代的な家具とヴィンテージ家具を生成するファクトリーを作成します。

ステップ1: 抽象製品を定義する

まずは、テーブルと椅子のための抽象製品クラスを定義します。

from abc import ABC, abstractmethod

# 抽象製品クラス
class AbstractTable(ABC):
    @abstractmethod
    def describe(self):
        pass

class AbstractChair(ABC):
    @abstractmethod
    def describe(self):
        pass

ステップ2: 具体的な製品を定義する

次に、現代的な家具とヴィンテージ家具の具体的な製品クラスを定義します。

# 現代的なテーブル
class ModernTable(AbstractTable):
    def describe(self):
        return "This is a modern table."

# 現代的な椅子
class ModernChair(AbstractChair):
    def describe(self):
        return "This is a modern chair."

# ヴィンテージテーブル
class VintageTable(AbstractTable):
    def describe(self):
        return "This is a vintage table."

# ヴィンテージ椅子
class VintageChair(AbstractChair):
    def describe(self):
        return "This is a vintage chair."

ステップ3: 抽象ファクトリーを定義する

次に、家具を生成するための抽象ファクトリークラスを定義します。

# 抽象ファクトリークラス
class AbstractFurnitureFactory(ABC):
    @abstractmethod
    def create_table(self) -> AbstractTable:
        pass

    @abstractmethod
    def create_chair(self) -> AbstractChair:
        pass

ステップ4: 具体的なファクトリーを定義する

現代的な家具とヴィンテージ家具を生成する具体的なファクトリーを実装します。

# 現代的な家具ファクトリー
class ModernFurnitureFactory(AbstractFurnitureFactory):
    def create_table(self) -> AbstractTable:
        return ModernTable()

    def create_chair(self) -> AbstractChair:
        return ModernChair()

# ヴィンテージ家具ファクトリー
class VintageFurnitureFactory(AbstractFurnitureFactory):
    def create_table(self) -> AbstractTable:
        return VintageTable()

    def create_chair(self) -> AbstractChair:
        return VintageChair()

ステップ5: クライアントコード

最後に、クライアントコードを実装し、抽象ファクトリーパターンを使用してオブジェクトを生成します。

def client_code(factory: AbstractFurnitureFactory):
    table = factory.create_table()
    chair = factory.create_chair()

    print(table.describe())
    print(chair.describe())

# 現代的な家具を使う
modern_factory = ModernFurnitureFactory()
client_code(modern_factory)

# ヴィンテージ家具を使う
vintage_factory = VintageFurnitureFactory()
client_code(vintage_factory)

コード解説

  1. 抽象製品クラス: AbstractTableAbstractChair が家具のインターフェースを定義します。これにより、具体的な家具クラスはこのインターフェースに従って実装されます。

  2. 具体的な製品クラス: ModernTableModernChairVintageTableVintageChair がそれぞれの具体的な家具の実装を提供します。

  3. 抽象ファクトリークラス: AbstractFurnitureFactory が家具を生成するためのインターフェースを定義します。

  4. 具体的なファクトリークラス: ModernFurnitureFactoryVintageFurnitureFactory がそれぞれの家具の具体的なインスタンスを生成します。

  5. クライアントコード: client_code 関数は、ファクトリーを通じて家具を生成し、それらの説明を出力します。

このように、抽象ファクトリーパターンを利用することで、クライアントコードは具体的な家具クラスに依存せず、異なるファミリーの家具を柔軟に生成することができるのです。

出力結果: