> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/design-patterns/builder-design-pattern.md).

# Builder Design Pattern

ধরুন, আপনি একটা কাস্টম বার্গার বানাতে চান। এক রেস্টুরেন্টে গিয়ে আপনি বললেন, আমাকে একটা বার্গার দিন। কিন্তু ওয়েটার আপনাকে জিজ্ঞেস করল,

* ব্রেড কোনটা লাগবে? সাদা, গমের নাকি সিড ব্রেড?
* প্যাটিটা কী হবে? গরুর মাংস, মুরগি, না কি ভেজি?
* চিজ চাই নাকি?
* সস কেমন হবে?
* এক্সট্রা কিছু লাগবে?

এখন, আপনি যদি প্রতিবার অর্ডার করতে গিয়ে এসব প্রশ্নের উত্তর দিতে হয়, তাহলে বিষয়টা কষ্টকর হয়ে যাবে।

তাই, একটা **Builder** রাখা হলো, যাকে আপনি শুধু বলবেন, আমার একটা স্পেশাল বার্গার বানিয়ে দাও। সে আপনাকে সব কিছু কাস্টমাইজ করে একদম পারফেক্ট বার্গার বানিয়ে দেবে।

### **Builder Pattern** কী?

**Builder Pattern** হল একটা **Creational Design Pattern,** যা ধাপে ধাপে (step-by-step) একটা জটিল অবজেক্ট তৈরি করতে সাহায্য করে। যখন কোনো অবজেক্টের অনেক কনফিগারেশন অপশন থাকে, তখন এই প্যাটার্ন ব্যবহার করা হয়।

### কখন ব্যবহার করব?

* যখন অবজেক্ট বানানোর প্রসেসটা খুব জটিল হয়।
* যখন একই অবজেক্টের বিভিন্ন ধরনের ভ্যারিয়েশন দরকার হয়।
* যখন constructor-এর প্যারামিটার বেশি হয়ে যায় এবং সেটাকে সহজ করতে চাই।

***

### **Builder Pattern এর উদাহরণ**

ধরুন, আমরা একটা `Burger` ক্লাস তৈরি করব, যেখানে কাস্টমাইজড বার্গার বানানো যাবে।

{% code lineNumbers="true" %}

```php
<?php

// Step 1: Burger Class
class Burger {
    public $bread;
    public $patty;
    public $cheese;
    public $sauce;

    public function show() {
        return "Burger with $this->bread bread, $this->patty patty, " . 
               ($this->cheese ? "cheese, " : "no cheese, ") . 
               "$this->sauce sauce.";
    }
}

// Step 2: Burger Builder
class BurgerBuilder {
    private $burger;

    public function __construct() {
        $this->burger = new Burger();
    }

    public function setBread($bread) {
        $this->burger->bread = $bread;
        return $this;
    }

    public function setPatty($patty) {
        $this->burger->patty = $patty;
        return $this;
    }

    public function addCheese() {
        $this->burger->cheese = true;
        return $this;
    }

    public function setSauce($sauce) {
        $this->burger->sauce = $sauce;
        return $this;
    }

    public function build() {
        return $this->burger;
    }
}

// Step 3: Using Builder
$burger = (new BurgerBuilder())
            ->setBread("Wheat")
            ->setPatty("Beef")
            ->addCheese()
            ->setSauce("BBQ")
            ->build();

echo $burger->show();
?>
```

{% endcode %}

#### **আউটপুট:**

```
Burger with Wheat bread, Beef patty, cheese, BBQ sauce.
```

***

### Laravel & Django-তে Builder Pattern

#### Laravel-এ কোথায় ব্যবহার হয়?

Laravel-এ `Query Builder` আসলে **Builder Pattern** ব্যবহার করে। যেমনঃ

```php
DB::table('users')
    ->where('status', 'active')
    ->orderBy('name', 'asc')
    ->get();
```

এখানে আমরা step-by-step query তৈরি করছি, যা একদম **Builder Pattern**-এর মতোই কাজ করছে।

#### Django-তে কোথায় ব্যবহার হয়?

Django ORM-এ QuerySet API **Builder Pattern** অনুসরণ করে। যেমনঃ

```python
User.objects.filter(status='active').order_by('name')
```

এখানেও স্টেপ বাই স্টেপ আমরা একটা জটিল কুয়েরি তৈরি করছি, যেটা **Builder Pattern**-এর ভালো উদাহরণ।

***

✅ Builder Pattern ব্যবহার হয় ধাপে ধাপে জটিল অবজেক্ট তৈরি করতে।\
✅ PHP, Laravel, Django-তে এর প্রয়োগ পাওয়া যায়।\
✅ Laravel Query Builder ও Django ORM QuerySet এই প্যাটার্ন অনুসরণ করে।

এখন, আপনি যদি কোনো অ্যাপে এমন কিছু চান যেখানে অনেক অপশনের অবজেক্ট বানানোর দরকার হয়, তাহলে Builder Pattern বেস্ট অপশন!&#x20;
