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()
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})"
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)