Builder Design Pattern

Recently, I have been studying design patterns. I'm struggling to find a script in which I can implement a builder pattern for this script. Does anyone have any example?

Any answer would be greatly appreciated.

+4
source share
5 answers

SQLOrm is a good example of combining a builder pattern with an appropriate set of method names that let you build SQL, how to work with DSL.

eg,

private String getPersonAndmaybePet_JavaStr(boolean personName, boolean isAdult, int[] petTypes) {
  StringBuilder sb = new StringBuilder();
  // do SELECT
  sb.append("SELECT ");
  if(personName) 
    sb.append("person.name,");
  if(petTypes != null) 
    sb.append("pet.*,");

  // do FROM
  sb.delete(sb.length() - 1, sb.length()); // remove last comma
  sb.append(" FROM person,");
  if(petTypes != null) 
    sb.append(" Pet,");

  // do WHERE
  sb.delete(sb.length() - 1, sb.length()); // remove last comma
  sb.append(" WHERE ");
  if(isAdult) 
    sb.append(" person.age >= 18");
  else 
    sb.append(" person.age < 18");

  if(petTypes != null) {
    StringBuilder commaList = new StringBuilder();
    for(int id : petTypes) {
        commaList.append(id);
        commaList.append(",");
    }
    commaList.delete(commaList.length() - 1, commaList.length());
    sb.append(" AND person.pet_id = pet.id AND pet.pettype IN (" + commaList.toString() + ")");
  }
  return sb.toString();
}

becomes

private String getPersonAndmaybePet(boolean personName, boolean isAdult, int[] petTypes) {
  SelectBuilder qry = new SelectBuilder();

  if(personName) 
    qry.select("person.name").from("person");    

  if(isAdult) 
    qry.from("person").where().and("person.age >= 18");
  else 
    qry.from("person").where().and("person.age < 18");

  if(petTypes != null) {
    qry.select("pet.*").from("Pet") //
            .where() //
            .and("person.pet_id = pet.id") //
            .and("pet.pettype IN (#)", QueryBuilderHelper.numbers(petTypes));
  }
  return qry.toSql();
}
+4
source

If you have a very complex object (say something that requires 3, 4 or more different other objects to work with), you should use Builderthis object to build it correctly.

+1

Builder HTML XML-. :

require 'markaby' # Markaby is an HTML builder library for Ruby

builder = Markaby::Builder.new

builder.html {
  head {
    title 'Sample Title'
    link href: 'style.css', rel: 'stylesheet'
  }

  body {
    h1 'Sample Title'
    ul {
      li 'Item 1'
      li 'Item 2'
    }
  }
}

print builder
0

Effective Java.

- , .

telescopic, :

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }

, - , , .

( ), POJO :

Pizza pizza = new Pizza(10);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);

.

? , . :

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

Pizza, , , .

Pizza pizza = new Pizza.Builder(12)
                       .cheese(true)
                       .pepperoni(true)
                       .bacon(true)
                       .build();

Java Builder.

0

Source: https://habr.com/ru/post/1779734/


All Articles