Skip to content

Instantly share code, notes, and snippets.

@jazlopez
Created July 2, 2023 22:34
Show Gist options
  • Save jazlopez/abb5d3718ac1bddc08db2b27dcc5a405 to your computer and use it in GitHub Desktop.
Save jazlopez/abb5d3718ac1bddc08db2b27dcc5a405 to your computer and use it in GitHub Desktop.
From effective Java 3rd. Edition

Builder Pattern

With this pattern instead of calling the class constructur instead use a static factory method with all of the required parameters and gets a builder object. Then calls setter-like methods on the builder object to set each optional parameter of interest. Finally, calls a parameterless buildmethod to generate the object, which is typically immutable.

public class NutritionFacts { 
  private final int servingSize; 
  private final int servings; 
  private final int calories; 
  private final int fat;
  private final int sodium; 
  private final int carbohydrate;

  public static class Builder {
    // Required parameters
    private final int servingSize;
    private final int servings;

    // Optional parameters - initialized to default values
    private int calories = 0;
    private int fat = 0;
    private int sodium = 0;
    private int carbohydrate = 0;

    public Builder(int servingSize, int servings) { 
      this.servingSize = servingSize;
      this.servings = servings;
    }
    
    public Builder calories(int val){
      calories = val; 
      return this;
    }
    
    public Builder fat(int val){ 
      fat = val; 
      return this; 
    }

    public Builder sodium(int val){
      sodium = val; 
      return this; 
    }
    
    public Builder carbohydrate(int val) { 
      carbohydrate = val; 
      return this; 
    }

    public NutritionFacts build() { 
      return new NutritionFacts(this);
    } 
  }
  
  private NutritionFacts(Builder builder) { 
    servingSize = builder.servingSize; 
    servings = builder.servings;
    calories =builder.calories;
    fat = builder.fat;
    sodium = builder.sodium;
    carbohydrate = builder.carbohydrate;
  } 
}

This client code is easy to write and, more importantly, easy to read. The Builder pattern simulates named optional parameters as found in Python

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100).sodium(35).carbohydrate(27).build();

Jaziel Lopez, Software Engineer, TJ Area, BC. MX

jlopez.mx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment