Padrão de projeto Factory em Java: encapsulando a criação de objetos
O padrão de projeto Factory é um padrão de criação que permite encapsular a lógica de criação de objetos em uma classe separada, conhecida como "fábrica". A ideia por trás deste padrão é fornecer uma maneira mais flexível e extensível de criar objetos, sem a necessidade de expor diretamente a lógica de criação ao código cliente.
Exemplo de implementação em Java
Em Java, o padrão Factory pode ser implementado de diversas maneiras, sendo a mais comum através de métodos estáticos de uma classe fábrica que retornam instâncias de objetos. Vamos ver um exemplo simples de como isso pode ser feito.
Imagine que temos uma classe chamada
que representa uma forma geométrica genérica, e queremos criar diferentes tipos de formas, como um círculo ou um quadrado. Em vez de criar as instâncias diretamente no código cliente, podemos definir uma classe fábrica FormaFactory que cria e retorna essas instâncias.Forma
public interface Forma {
void desenhar();
}
public class Circulo implements Forma {
@Override
public void desenhar() {
System.out.println("Desenhando um círculo");
}
}
public class Quadrado implements Forma {
@Override
public void desenhar() {
System.out.println("Desenhando um quadrado");
}
}
public class FormaFactory {
public static Forma criar(String tipo) {
if (tipo.equalsIgnoreCase("circulo")) {
return new Circulo();
} else if (tipo.equalsIgnoreCase("quadrado")) {
return new Quadrado();
} else {
throw new IllegalArgumentException("Tipo inválido de forma: " + tipo);
}
}
}
Neste exemplo, temos uma interface
que define um método Forma
, e duas classes concretas desenhar()
e Circulo
que implementam essa interface. Em seguida, temos a classe Quadrado
que tem um método estático FormaFactory
` quecriar
` recebe uma string com o tipo da forma que deve ser criada. Dependendo do tipo recebido, a fábrica retorna uma instância da classe correspondente.
Podemos então utilizar a fábrica para criar instâncias de formas no nosso código cliente:
public class Main {
public static void main(String[] args) {
Forma circulo = FormaFactory.criar("circulo");
Forma quadrado = FormaFactory.criar("quadrado");
circulo.desenhar();
quadrado.desenhar();
}
}
Este código irá criar uma instância de um círculo e outra de um quadrado, e chama o método
de cada uma.desenhar()
Conclusão
O padrão Factory pode ser muito útil em situações onde precisamos criar diferentes tipos de objetos com base em algum parâmetro, e não queremos expor essa lógica de criação diretamente no código cliente. Além disso, ele permite que o código cliente possa ser mais flexível e extensível, já que novas classes concretas podem ser adicionadas à fábrica sem que isso afete o restante do código.