Master Software Architecture & Clean Code!
Subscribe to Ram N Java for clean code, design pattern implementations, and practical Java tutorials!
SUBSCRIBE NOWStep-by-Step Beverage Construction with Builder Pattern
The Builder Design Pattern is a creational design pattern that solves the issue of complex object instantiation. In beverage preparation, drinks consist of multiple customizable ingredients—water, milk, sugar, and beverage bases like tea or coffee. Using telescoping constructors with multiple arguments makes code error-prone and hard to maintain.
By delegating ingredient configuration to dedicated builder implementations and controlling assembly through a director, the Builder pattern ensures clean, readable, and highly reusable construction workflows.
Complete Java Code Walkthrough
Here is an end-to-end, clean Java implementation demonstrating how to build beverages using the Builder pattern:
// 1. Product Class
class Beverage {
private int water;
private int milk;
private int sugar;
private String powderType;
public void setWater(int water) { this.water = water; }
public void setMilk(int milk) { this.milk = milk; }
public void setSugar(int sugar) { this.sugar = sugar; }
public void setPowderType(String powderType) { this.powderType = powderType; }
@Override
public String toString() {
return "Beverage [Water=" + water + "ml, Milk=" + milk + "ml, Sugar=" + sugar + " spoons, Powder=" + powderType + "]";
}
}
// 2. Builder Interface
interface BeverageBuilder {
void buildWater();
void buildMilk();
void buildSugar();
void buildPowder();
Beverage getBeverage();
}
// 3. Concrete Builder: Tea
class TeaBuilder implements BeverageBuilder {
private Beverage beverage = new Beverage();
@Override
public void buildWater() { beverage.setWater(100); }
@Override
public void buildMilk() { beverage.setMilk(50); }
@Override
public void buildSugar() { beverage.setSugar(2); }
@Override
public void buildPowder() { beverage.setPowderType("Tea Leaves"); }
@Override
public Beverage getBeverage() { return this.beverage; }
}
// 4. Concrete Builder: Coffee
class CoffeeBuilder implements BeverageBuilder {
private Beverage beverage = new Beverage();
@Override
public void buildWater() { beverage.setWater(60); }
@Override
public void buildMilk() { beverage.setMilk(120); }
@Override
public void buildSugar() { beverage.setSugar(1); }
@Override
public void buildPowder() { beverage.setPowderType("Filter Coffee Powder"); }
@Override
public Beverage getBeverage() { return this.beverage; }
}
// 5. Director Class
class BeverageDirector {
private BeverageBuilder builder;
public BeverageDirector(BeverageBuilder builder) {
this.builder = builder;
}
public void constructBeverage() {
builder.buildWater();
builder.buildMilk();
builder.buildSugar();
builder.buildPowder();
}
public Beverage getBeverage() {
return builder.getBeverage();
}
}
// 6. Client Application
public class BeverageBuilderApp {
public static void main(String[] args) {
// Construct Tea
BeverageBuilder teaBuilder = new TeaBuilder();
BeverageDirector teaDirector = new BeverageDirector(teaBuilder);
teaDirector.constructBeverage();
Beverage tea = teaDirector.getBeverage();
System.out.println("Serving: " + tea);
// Construct Coffee
BeverageBuilder coffeeBuilder = new CoffeeBuilder();
BeverageDirector coffeeDirector = new BeverageDirector(coffeeBuilder);
coffeeDirector.constructBeverage();
Beverage coffee = coffeeDirector.getBeverage();
System.out.println("Serving: " + coffee);
}
}
Key Architectural Benefits
- Encapsulated Construction: Isolates the step-by-step beverage assembly logic away from the client application.
- Flexible Variations: Enables creating distinct beverages (tea, coffee, or hot chocolate) with the exact same construction sequence.
- Cleaner Codebase: Eliminates large, confusing constructor parameter lists and avoids partial or inconsistent object states.
Watch More Related Design Pattern Tutorials
Click here to watch in Youtube : https://www.youtube.com/watch?v=enDdOjXr1GI
| Builder Design pattern - Implementation [Beverage] |
| Builder Design pattern - Implementation [Beverage] - Class Diagram |
Beverage.java