Qual a diferença entre Factory e Abstract Base Classes, ao meu ver os 2 poderiam ser usados no algoritmo, estou errado?
Qual a diferença entre Factory e Abstract Base Classes, ao meu ver os 2 poderiam ser usados no algoritmo, estou errado?
Oii Igor, tudo bem?
Desculpas pela demora em obter um retorno.
A Factory é um padrão de projeto que prevê a criação de objetos a partir da classe, então, com base em uma condição, determinada classe é instanciada, é uma fábrica de construção. Supondo que temos uma classe “Tradutor”, onde para cada localização irá retornar um tradutor específico, ou seja, será responsável por determinar qual tipo de objeto criar sem que o usuário tenha acesso a classe escolhida ou tenha que passar vários parâmetros. Veja como ficaria aplicando o conceito do factory method. O código apenas é apenas para fins didáticos:
class TradutorPortugues:
def traduz(self):
return "Mensagem em português"
class TradutorIngles:
def traduz(self):
return "Mensagem em inglês"
class TradutorFrances:
def traduz(self):
return "Mensagem em francês"
class TradutorFactory:
def factory(self, linguagem):
if linguagem == "pt":
return TradutorPortugues()
elif linguagem == "en":
return TradutorIngles()
elif linguagem == "fr":
return TradutorFrances()
Já o Abstract Base Classes é um modelo base para outras classes, ela em si não implementa nenhum método, mas as classes derivadas que herdam dela, irão implementar esses métodos abstratos. Esse tipo de classe é importante quando temos várias classes que são dependentes de um núcleo base. Supondo que temos que alimentar vários animais e vamos criar uma classe para cada animal: Gato, Cachorro e Leão. Podemos criar uma classe base que terá o método comer
e cada classe derivada de Animal, por padrão terá que implementar como aquele animal irá comer:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def comer(self):
pass
class Leao(Animal):
def comer(self):
print("Ração do Leão")
class Gato(Animal):
def comer(self):
print("Ração do Gato")
class Cachorro(Animal):
def comer(self):
print("Ração do Cachorro")
animais = [Leao(), Gato(), Cachorro()]
for felinos in animais:
felinos.comer()
Resultado:
Ração do Leão
Ração do Gato
Ração do Cachorro
Ou seja, classes abstratas e método de fábrica são implementações que se parecem, mas, tem propósitos diferentes. No projeto que o instrutor realizou, por as classes DocCpf
e DocCnpj
terem métodos similares como por exemplo o valida
poderia também ter sido criada uma classe para abstrair a assinatura desses métodos.
Fico à disposição em caso de dúvidas.
Abraços e bons estudos.