Padrão de projeto Factory em Java: encapsulando a criação de objetos

Por Gaspar Barancelli Junior em 06 de março de 2023

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 Forma 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.

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 Forma que define um método desenhar(), e duas classes concretas Circulo e Quadrado que implementam essa interface. Em seguida, temos a classe FormaFactory que tem um método estático ` 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 desenhar() de cada uma.

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.

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post