Builder
Builder
Builder es un patrón de diseño creacional que nos permite construir objetos complejos paso a paso. El patrón nos permite producir distintos tipos y representaciones de un objeto empleando el mismo código de construcción.
Imaginemos que tenemos un objeto cuya construcción puede variar, siendo necesario aveces construir objetos con ciertos atributos nada más, tener que crear un constructor para cada caso de uso, puede generar mucho código.
La solución pasa por crear un builder para la clase que se encarge de crear un objeto paso a paso.
public class Person {
private String firstName;
private String lastName;
private Person(){
}
public static PersonBuilder builder() {
return new PersonBuilder();
}
private void firstName(String firstName){
this.firstName = firstName;
}
private void lastName(String firstName){
this.firstName = firstName;
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
static class PersonBuilder {
private final Person person = new Person();
public Person build(){
return this.person;
}
public PersonBuilder firstName(String firstName) {
this.person.firstName = firstName;
return this;
}
public PersonBuilder lastName(String lastName) {
this.person.lastName = lastName;
return this;
}
}
}
En este caso, la clase tiene una clase interna que obligará a usar el builder para crear una instancia de la clase principal. Para añadir nuevos atributos solo hay que añadirlo en la clase principal y crear el setter en la clase interna, permitiendo construir objetos indiferentemente del numero de atributos que necesite para su construcción.
Aqui hay un ejemplo de otro ejemplo pero en este caso usar el builder es opcional.
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public static PersonBuilder builder() {
return new PersonBuilder();
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return String.format("%s %s", firstName, lastName);
}
}
/**
* Patrón builder. Hace al código más legible, y evita usar constructures, que
* puedan afectar a muchas clases cuando se le agregue un nuevo parametro.
*/
public class PersonBuilder {
private String firstName;
private String lastName;
public PersonBuilder firstName(String firstName) {
this.firstName = firstName;
return this;
}
public PersonBuilder lastName(String lastName) {
this.lastName = lastName;
return this;
}
public Person build() {
return new Person(firstName, lastName);
}
}
public static void main(String[] args) {
Person person = Person.builder()
.firstName("Nikola")
.lastName("Tesla")
.build();
System.out.println(person);
}