抽象ファクトリーパターンは、関連するオブジェクトのグループを生成するためのインターフェースを提供するデザインパターンです。このパターンを利用することで、クライアントコードは具体的なクラスに依存せず、オブジェクトの生成を柔軟に行うことができます。
ここでは、抽象ファクトリーパターンを使って、異なる種類の家具(テーブルと椅子)を生成する方法を示します。具体的には、現代的な家具とヴィンテージ家具を生成するファクトリーを作成します。
まずは、テーブルと椅子のための抽象製品クラスを定義します。
from abc import ABC, abstractmethod
# 抽象製品クラス
class AbstractTable(ABC):
@abstractmethod
def describe(self):
pass
class AbstractChair(ABC):
@abstractmethod
def describe(self):
pass
次に、現代的な家具とヴィンテージ家具の具体的な製品クラスを定義します。
# 現代的なテーブル
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."
次に、家具を生成するための抽象ファクトリークラスを定義します。
# 抽象ファクトリークラス
class AbstractFurnitureFactory(ABC):
@abstractmethod
def create_table(self) -> AbstractTable:
pass
@abstractmethod
def create_chair(self) -> AbstractChair:
pass
現代的な家具とヴィンテージ家具を生成する具体的なファクトリーを実装します。
# 現代的な家具ファクトリー
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()
最後に、クライアントコードを実装し、抽象ファクトリーパターンを使用してオブジェクトを生成します。
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)
抽象製品クラス: AbstractTable
と AbstractChair
が家具のインターフェースを定義します。これにより、具体的な家具クラスはこのインターフェースに従って実装されます。
具体的な製品クラス: ModernTable
と ModernChair
、VintageTable
と VintageChair
がそれぞれの具体的な家具の実装を提供します。
抽象ファクトリークラス: AbstractFurnitureFactory
が家具を生成するためのインターフェースを定義します。
具体的なファクトリークラス: ModernFurnitureFactory
と VintageFurnitureFactory
がそれぞれの家具の具体的なインスタンスを生成します。
クライアントコード: client_code
関数は、ファクトリーを通じて家具を生成し、それらの説明を出力します。
このように、抽象ファクトリーパターンを利用することで、クライアントコードは具体的な家具クラスに依存せず、異なるファミリーの家具を柔軟に生成することができるのです。