Sobes.tech
Middle+

O que é o padrão de projeto Factory Builder?

sobes.tech IA

Resposta da IA

O padrão Factory Builder, ou melhor dizendo, Factory Method em combinação com Builder, é uma combinação de dois padrões que melhora a criação de objetos complexos.

Factory Method define uma interface para criar um objeto, mas permite que as subclasses decidam qual classe instanciar. Delegam a responsabilidade de criar o objeto às subclasses.

Builder separa a construção de um objeto complexo de sua representação, de modo que o mesmo processo de construção pode criar diferentes representações. Permite construir um objeto passo a passo, usando uma cadeia de chamadas de métodos.

A combinação desses padrões é frequentemente encontrada em cenários onde é necessário criar várias variantes de um objeto complexo. O Factory Method determina qual tipo de Builder deve ser usado, e o Builder então cuida de como criar esse objeto com diferentes configurações.

Exemplo de uso: Quando se tem uma hierarquia de classes de objetos que requerem inicialização complexa, e deseja-se criar esses objetos com configurações diferentes.

Estrutura típica de interação:

  • Fábrica: Possui um método que retorna uma instância de um Builder específico, dependendo dos parâmetros de entrada ou do seu tipo.
  • Builder: Possui métodos para configurar passo a passo os parâmetros do objeto complexo e um método final build(), que retorna o objeto pronto.
  • Produto: O objeto complexo criado pelo Builder.

Vantagens:

  • Melhor legibilidade e gerência do código na criação de objetos complexos.
  • Flexibilidade na criação de diferentes configurações do mesmo tipo de objeto.
  • Separação da lógica de criação do objeto de sua representação.
  • Facilita a adição de novos tipos de produtos (usando Factory Method) ou novos métodos de construção (usando Builder).

Desvantagens:

  • Aumento no número de classes no projeto.
  • Pode ser excessivo para objetos simples.

Exemplo (pseudo-código):

// Produto
class ComplexObject {
    private String partA;
    private int partB;

    // construtor privado
    private ComplexObject(String partA, int partB) {
        this.partA = partA;
        this.partB = partB;
    }

    // Classe interna Builder
    public static class Builder {
        private String partA;
        private int partB;

        public Builder setPartA(String partA) {
            this.partA = partA;
            return this;
        }

        public Builder setPartB(int partB) {
            this.partB = partB;
            return this;
        }

        public ComplexObject build() {
            return new ComplexObject(partA, partB);
        }
    }
}

// Fábrica que retorna um Builder
class ComplexObjectFactory {
    public static ComplexObject.Builder createDefaultBuilder() {
        return new ComplexObject.Builder()
                .setPartA("defaultA")
                .setPartB(10);
    }

    public static ComplexObject.Builder createSpecialBuilder() {
        return new ComplexObject.Builder()
                .setPartA("specialA")
                .setPartB(50);
    }
}

// Uso:
// ComplexObject obj1 = ComplexObjectFactory.createDefaultBuilder().build();
// ComplexObject obj2 = ComplexObjectFactory.createSpecialBuilder().setPartA("customA").build();