O padrão de projeto Builder encapsula as propriedades de um objeto e permite que você construa uma representação dele. Este padrão permite construir objetos complexos, com propriedades diferentes, embora pertençam à mesma classe.
Uma classe de objeto típica contém atributos, construtores e métodos. O padrão construtor permite extrair a lógica de construção da classe de objeto e colocá-la em classes chamadas construtores. Você pode usar essas classes construtoras para criar diferentes variações do mesmo objeto.
Implementando o Padrão Builder em Java
Um bom exemplo do padrão construtor é um sistema de pedidos de pizza que permite aos clientes selecionar diferentes opções de cobertura.
A classe do produto
Uma abordagem é tornar o construtor uma interface, mas primeiro você precisará criar uma classe de produto. O produto neste aplicativo de exemplo é uma pizza.
públicoaulapizza{
// propriedades
privadoint número do pedido;
privado Corda massa de pizza;
privado Corda cobertura;
// getters e setters
públicointgetOrderNumber(){
retornar número do pedido;
}
públicovaziosetOrderNumber(int número do pedido){
esse.orderNumber = orderNumber;
}
público Corda getPizzaDough(){
retornar massa de pizza;
}
públicovaziosetPizzaDough(Cordão massa de pizza){
esse.pizzaDough = pizzaDough;
}
público Corda getTopping(){
retornar cobertura;
}
públicovaziosetTopping(cobertura de corda){
esse.topping = cobertura;
}
}
A Classe do Construtor
a pizza classe Java tem três propriedades e seus respectivos getters e setters, mas não há métodos construtores. A interface do construtor permitirá que você crie cada aspecto do objeto pizza separadamente. Isso permitirá que você recupere todo o objeto pizza.
públicointerfaceConstrutor{
públicovaziocriarPizzaDough();
públicovaziocriarTopping();
público pizza pegarPizza();
}
O aplicativo de amostra de pizza permite que os clientes peçam qualquer cobertura, como queijo, calabresa, cebola ou combinações diferentes. Portanto, uma pizza que um cliente pedirá é queijo.
públicoaulaCheesePizzaBuilderimplementosConstrutor{
privado Pizza de pizza;
públicoCheesePizzaBuilder(){
esse.pizza = novo Pizza();
}
@Sobrepor
públicovaziocriarPizzaDough(){
esse.pizza.setPizzaDough("Massa");
}
@Sobrepor
públicovaziocriarTopping(){
esse.pizza.setTopping("Queijo");
}
@Sobrepor
público pizza pegarPizza(){
retornaresse.pizza;
}
}
A classe CheesePizzaBuilder implementa a interface Builder e a utiliza para criar uma nova pizza de queijo. Esta é uma representação do objeto Pizza. Ele também faz isso de forma independente da classe Pizza.
A classe CheesePizzaBuilder não sabe muito sobre a classe Pizza, ela apenas sabe o que precisa saber para completar sua função. Ele sabe que a classe Pizza tem uma massa e uma propriedade de cobertura e define essas propriedades como dois valores específicos que toda pizza de queijo terá. Agora, toda vez que o aplicativo chamar a classe CheesePizzaBuilder, ele criará uma nova Pizza com cobertura de queijo.
A classe do diretor
A classe director é um aspecto crucial do padrão builder. O único propósito de uma classe construtora concreta é criar um objeto específico. Ele consegue isso criando as diferentes partes de um objeto separadamente.
No entanto, as classes concretas construtoras desconhecem o algoritmo. Nenhuma das classes de construtor sabe construir a massa antes de adicionar a cobertura. Esta é a função da classe director.
públicoaulaDiretor{
privado Construtor pizzaBuilder;
públicoDiretor(Construtor PizzaConstrutor){
esse.pizzaBuilder = pizzaBuilder;
}
público pizza pegarPizza(){
retornaresse.pizzaBuilder.getPizza();
}
públicovaziofazerPizza(){
esse.pizzaBuilder.createPizzaDough();
esse.pizzaBuilder.createTopping();
}
}
A classe Director usa a interface do construtor para fazer pizzas. É o guardião do algoritmo.
As vantagens de usar o padrão de projeto Builder
A principal vantagem de usar o padrão de design do construtor é sua propriedade de encapsulamento. Este é um aspecto crucial da engenharia de software, pois auxilia no desenvolvimento de aplicativos seguros.
Outra vantagem desse padrão de projeto é sua abordagem de construção de objetos. Ele permite criar processos de várias etapas, onde cada etapa é independente, o que facilita a depuração.