from creational.abstract_factory.AbstractFactory import AbstractFactory from creational.abstract_factory.products import ( ConcreteProductA1, ConcreteProductB1, ConcreteProductA2, ConcreteProductB2, ) class ConcreteFactory1(AbstractFactory): """ Concrete Factories produce a family of products that belong to a single variant. The factory guarantees that resulting products are compatible. Note that signatures of the Concrete Factory's methods return an abstract product, while inside the method a concrete product is instantiated. """ def create_product_a(self) -> ConcreteProductA1: return ConcreteProductA1() def create_product_b(self) -> ConcreteProductB1: return ConcreteProductB1() class ConcreteFactory2(AbstractFactory): """ Each Concrete Factory has a corresponding product variant. """ def create_product_a(self) -> ConcreteProductA2: return ConcreteProductA2() def create_product_b(self) -> ConcreteProductB2: return ConcreteProductB2()