An example of an abstract factory in the Python programming language
""" Provide an interface for creating families of related or dependent objects without specifying their concrete classes. """ import abc class AbstractFactory(metaclass=abc.ABCMeta): """ Declare an interface for operations that create abstract product objects. """ @abc.abstractmethod def create_product_a(self): pass @abc.abstractmethod def create_product_b(self): pass class ConcreteFactory1(AbstractFactory): """ Implement the operations to create concrete product objects. """ def create_product_a(self): return ConcreteProductA1() def create_product_b(self): return ConcreteProductB1() class ConcreteFactory2(AbstractFactory): """ Implement the operations to create concrete product objects. """ def create_product_a(self): return ConcreteProductA2() def create_product_b(self): return ConcreteProductB2() class AbstractProductA(metaclass=abc.ABCMeta): """ Declare an interface for a type of product object. """ @abc.abstractmethod def interface_a(self): pass class ConcreteProductA1(AbstractProductA): """ Define a product object to be created by the corresponding concrete factory. Implement the AbstractProduct interface. """ def interface_a(self): pass class ConcreteProductA2(AbstractProductA): """ Define a product object to be created by the corresponding concrete factory. Implement the AbstractProduct interface. """ def interface_a(self): pass class AbstractProductB(metaclass=abc.ABCMeta): """ Declare an interface for a type of product object. """ @abc.abstractmethod def interface_b(self): pass class ConcreteProductB1(AbstractProductB): """ Define a product object to be created by the corresponding concrete factory. Implement the AbstractProduct interface. """ def interface_b(self): pass class ConcreteProductB2(AbstractProductB): """ Define a product object to be created by the corresponding concrete factory. Implement the AbstractProduct interface. """ def interface_b(self): pass def main(): for factory in (ConcreteFactory1(), ConcreteFactory2()): product_a = factory.create_product_a() product_b = factory.create_product_b() product_a.interface_a() product_b.interface_b() if __name__ == "__main__": main()