DEV Community

Michel Moreira
Michel Moreira

Posted on • Updated on

Padrão Abstract Factory em Python

O Abstract Factory é um padrão criacional, este permite a produção de famílias de objetos relacionados sem a necessidade de especificar suas classes concretas.

O padrão especifica que devem ser declaradas interfaces para cada objeto distinto das famílias de objetos, todas as variantes seguirão uma interface estabelecida.

Exemplo do código em Python

class AbstractFactory(ABC):

    @abstractmethod
    def create_product_a(self) -> AbstractProductA:
        pass

    @abstractmethod
    def create_product_b(self) -> AbstractProductB:
        pass


class ConcreteFactory1(AbstractFactory):

    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA1()

    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB1()


class ConcreteFactory2(AbstractFactory):

    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA2()

    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB2()
Enter fullscreen mode Exit fullscreen mode

Cada fábrica pode possuir vários objetos específicos, estes também devem estabelecer formas abstratas para servirem de interface base.

class AbstractProductA(ABC):

    @abstractmethod
    def useful_function_a(self) -> str:
        pass


class ConcreteProductA1(AbstractProductA):
    def useful_function_a(self) -> str:
        return "The result of the product A1."


class AbstractProductB(ABC):

    @abstractmethod
    def useful_function_b(self) -> None:

        pass

    @abstractmethod
    def another_useful_function_b(self, collaborator: AbstractProductA) -> None:

        pass

class ConcreteProductB1(AbstractProductB):
    def useful_function_b(self) -> str:
        return "The result of the product B1."

    def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
        result = collaborator.useful_function_a()
        return f"The result of the B1 collaborating with the ({result})"
Enter fullscreen mode Exit fullscreen mode

Os produtos podem conter métodos específicos e também tem a capacidade de interagir entre si mesmos, apesar de que uma compatibilidade total só é possível entre produtos com a mesma interface.

Não encontrei diferenças relevantes da implementação deste padrão em Java e Python.


Referências
Padrões de Projeto (Diogo Moreira, 2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets, 2020)
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.

Top comments (0)