# बिल्डर पैटर्न — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-builder-pattern

> जटिल अपरिवर्तनीय ऑब्जेक्ट को चरणबद्ध ढंग से एक fluent Builder से बनाएँ, लंबी पैरामीटर सूची वाले कंस्ट्रक्टर व telescoping ओवरलोड से बचें।

## टेलीस्कोपिंग कंस्ट्रक्टर समस्या

जब किसी क्लास में कई वैकल्पिक फ़ील्ड हों, तो 6+ पैरामीटर वाला कंस्ट्रक्टर (या हर संयोजन के लिए ओवरलोड) पढ़ने में कठिन व त्रुटि-प्रवण हो जाता है — गलती से दो `int` आर्ग्युमेंट बदल सकते हैं। **Builder** इसे नामित, चेन योग्य सेटर से ठीक करता है।

## एक fluent Builder

हर `with*`/सेटर `this` लौटाता है, इसलिए कॉल चेन बनती हैं; `build()` अंतिम अपरिवर्तनीय ऑब्जेक्ट बनाता है। Lombok का `@Builder` जैसा टूल यह बॉयलरप्लेट अपने आप बना देता है।

```java
class Pizza {
    private final String size;
    private final List<String> toppings;
    private Pizza(Builder b) { this.size = b.size; this.toppings = b.toppings; }

    static class Builder {
        private String size = "medium";
        private List<String> toppings = new ArrayList<>();
        Builder size(String s) { this.size = s; return this; }
        Builder addTopping(String t) { toppings.add(t); return this; }
        Pizza build() { return new Pizza(this); }
    }
}

Pizza p = new Pizza.Builder().size("large").addTopping("olives").build();
```
