from abc import ABC, abstractmethod
[docs]
class AbstractProductA(ABC):
"""Abstract interface for ProductA."""
[docs]
@abstractmethod
def operation_a(self) -> str:
"""Perform an operation specific to ProductA."""
pass
[docs]
class AbstractProductB(ABC):
"""Abstract interface for ProductB."""
[docs]
@abstractmethod
def operation_b(self) -> str:
"""Perform an operation specific to ProductB."""
pass
[docs]
class ConcreteProductA1(AbstractProductA):
"""Concrete implementation of ProductA for Family 1."""
[docs]
def operation_a(self) -> str:
"""Implement operation A for ConcreteProductA1."""
return "ConcreteProductA1"
[docs]
class ConcreteProductA2(AbstractProductA):
"""Concrete implementation of ProductA for Family 2."""
[docs]
def operation_a(self) -> str:
"""Implement operation A for ConcreteProductA2."""
return "ConcreteProductA2"
[docs]
class ConcreteProductB1(AbstractProductB):
"""Concrete implementation of ProductB for Family 1."""
[docs]
def operation_b(self) -> str:
"""Implement operation B for ConcreteProductB1."""
return "ConcreteProductB1"
[docs]
class ConcreteProductB2(AbstractProductB):
"""Concrete implementation of ProductB for Family 2."""
[docs]
def operation_b(self) -> str:
"""Implement operation B for ConcreteProductB2."""
return "ConcreteProductB2"
[docs]
class AbstractFactory(ABC):
"""Abstract Factory interface."""
[docs]
@abstractmethod
def create_product_a(self) -> AbstractProductA:
"""Create a product of type A."""
pass
[docs]
@abstractmethod
def create_product_b(self) -> AbstractProductB:
"""Create a product of type B."""
pass
[docs]
class ConcreteFactory1(AbstractFactory):
"""Concrete Factory 1: Creates products belonging to Family 1."""
[docs]
def create_product_a(self) -> AbstractProductA:
"""Create a product of type A (ConcreteProductA1)."""
return ConcreteProductA1()
[docs]
def create_product_b(self) -> AbstractProductB:
"""Create a product of type B (ConcreteProductB1)."""
return ConcreteProductB1()
[docs]
class ConcreteFactory2(AbstractFactory):
"""Concrete Factory 2: Creates products belonging to Family 2."""
[docs]
def create_product_a(self) -> AbstractProductA:
"""Create a product of type A (ConcreteProductA2)."""
return ConcreteProductA2()
[docs]
def create_product_b(self) -> AbstractProductB:
"""Create a product of type B (ConcreteProductB2)."""
return ConcreteProductB2()