Você já se pegou em uma situação em que precisava criar objetos sem conhecer todos os detalhes das classes envolvidas? Imagine que você tem uma fábrica de automóveis: o cliente só quer o carro pronto, e não precisa saber como cada parte foi montada. É exatamente essa a ideia por trás do padrão Factory!
A História por Trás do Factory
Lembro de uma época em que trabalhava em um projeto complexo e, a cada nova funcionalidade, surgiam inúmeras variações de objetos. O código ficava confuso e difícil de manter, e o time se perdia em meio a muitos detalhes de criação de instâncias. Foi aí que descobrimos o padrão Factory — uma solução elegante para abstrair a criação de objetos. Com ele, não precisamos saber exatamente qual classe está sendo instanciada, apenas confiamos que a “fábrica” vai nos entregar o objeto certo, pronto para uso.
O Que é o Padrão Factory?
Em termos simples, o padrão Factory (ou Factory Method) define uma interface para criar objetos, mas permite que as subclasses decidam qual classe instanciar. Isso significa que o código que utiliza esses objetos não precisa se preocupar com a complexidade da criação, promovendo um acoplamento menor e uma maior flexibilidade na manutenção.
Implementação em C++
Vamos ver um exemplo em C++ que ilustra o conceito. Suponha que queremos criar diferentes tipos de veículos sem expor a lógica de criação para o cliente.
#include <iostream>
#include <memory>
#include <string>
// Classe base
class Veiculo {
public:
virtual void dirigir() = 0;
virtual ~Veiculo() {}
};
// Subclasse Carro
class Carro : public Veiculo {
public:
void dirigir() override {
std::cout << "Dirigindo um carro." << std::endl;
}
};
// Subclasse Moto
class Moto : public Veiculo {
public:
void dirigir() override {
std::cout << "Pilotando uma moto." << std::endl;
}
};
// Fábrica de veículos
class VeiculoFactory {
public:
// Método Factory: cria um veículo com base no tipo
static std::unique_ptr<Veiculo> criarVeiculo(const std::string &tipo) {
if (tipo == "carro")
return std::make_unique<Carro>();
else if (tipo == "moto")
return std::make_unique<Moto>();
else
return nullptr;
}
};
int main() {
auto carro = VeiculoFactory::criarVeiculo("carro");
if (carro) carro->dirigir();
auto moto = VeiculoFactory::criarVeiculo("moto");
if (moto) moto->dirigir();
return 0;
}O que esse código faz?
- Abstração da criação: O método
criarVeiculodecide, com base em uma string, qual tipo de veículo instanciar. - Flexibilidade: Caso novas categorias de veículos surjam, basta estender a fábrica sem modificar o código que consome esses objetos.
Implementação em Python
A linguagem Python permite uma abordagem ainda mais simples graças à sua natureza dinâmica. Veja como implementar o padrão Factory:
class Veiculo:
def dirigir(self):
raise NotImplementedError("Subclasses devem implementar o método dirigir.")
class Carro(Veiculo):
def dirigir(self):
print("Dirigindo um carro.")
class Moto(Veiculo):
def dirigir(self):
print("Pilotando uma moto.")
class VeiculoFactory:
@staticmethod
def criar_veiculo(tipo: str) -> Veiculo:
if tipo == "carro":
return Carro()
elif tipo == "moto":
return Moto()
else:
return None
if __name__ == "__main__":
veiculo = VeiculoFactory.criar_veiculo("carro")
if veiculo:
veiculo.dirigir()
veiculo = VeiculoFactory.criar_veiculo("moto")
if veiculo:
veiculo.dirigir()Como funciona?
- Método estático:
criar_veiculodecide qual classe instanciar com base no parâmetrotipo. - Simplicidade: O cliente não precisa conhecer a complexidade da criação dos objetos — ele só especifica o tipo desejado.
Por Que Isso é Importante Para Sua Carreira?
Dominar o padrão Factory mostra que você entende como criar sistemas flexíveis e desacoplados. Em entrevistas para vagas seniores, demonstrar esse conhecimento pode fazer a diferença, mostrando que você sabe pensar estrategicamente e projetar soluções escaláveis. Além disso, essa abordagem facilita a manutenção e a evolução dos sistemas, atributos altamente valorizados no mercado.
Conclusão
O padrão Factory é uma poderosa ferramenta no arsenal de qualquer desenvolvedor. Ele permite que você crie objetos de maneira inteligente, escondendo a complexidade da criação e promovendo um código mais limpo e flexível. Seja em C++ ou Python, o conceito é o mesmo: entregar o objeto certo, no momento certo, sem complicações.
Gostou dessa abordagem? Curta, compartilhe e comente: qual foi o desafio mais interessante que você já enfrentou ao implementar um padrão de projeto? Vamos transformar conhecimento em oportunidade!
Comentários
Postar um comentário