> 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/factory-design-pattern.md).

# Factory Design Pattern

ধরুন, আপনি একটা গাড়ির কোম্পানি খুলেছেন যেখানে বিভিন্ন ধরনের গাড়ি তৈরি হয়—যেমন **Audi, BMW, Toyota** ইত্যাদি। এখন যদি প্রতিটা গাড়ি বানানোর জন্য আলাদা আলাদা কারিগর (mechanic) রাখতে হয়, তাহলে কী হবে?

* Audi বানানোর জন্য এক ধরনের কারিগর,
* BMW বানানোর জন্য আরেকজন,
* Toyota বানানোর জন্য অন্য কেউ!

এভাবে আলাদা আলাদা কারিগর রেখে যদি গাড়ি বানানোর কাজ করেন, তাহলে ম্যানেজ করা কঠিন হবে।

তার চেয়ে যদি একটা `Factory (কারখানা)` বানানো হয়, যেখানে শুধু গাড়ির ধরন বললেই সেই অনুযায়ী গাড়ি বানিয়ে দেওয়া হয়—তাহলে কেমন হয়?

এটাই হলো **Factory Design Pattern**!

***

### **Factory Design Pattern কী?**

**Factory Design Pattern** হলো এক ধরনের Creational Design Pattern, যা অবজেক্ট তৈরি করার দায়িত্ব নিজে নেয় এবং ক্লাসের ইনস্ট্যান্স সরাসরি তৈরি না করে কোনো Factory Method দিয়ে অবজেক্ট তৈরি করে দেয়।

এতে ক্লায়েন্ট কোড (অর্থাৎ যে কোড অবজেক্ট চায়) সরাসরি `new` ব্যবহার করে অবজেক্ট তৈরি না করেও, Factory Class এর মাধ্যমে প্রয়োজনীয় অবজেক্ট পেয়ে যায়।

***

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

1. যখন অবজেক্ট তৈরির কমপ্লেক্স লজিক থাকে এবং সেটা হাইড করা দরকার।
2. যখন একাধিক টাইপের অবজেক্ট তৈরি হতে পারে এবং এগুলোকে এক জায়গায় ম্যানেজ করতে হয়।
3. যখন Dependency Injection ও Loose Coupling বজায় রাখতে হয়।

### Example of Factory Design Pattern

{% code lineNumbers="true" %}

```php
<?php

// Step 1: Parent Interface
interface Car {
    public function getType();
}

// Step 2: Concrete Classes
class Audi implements Car {
    public function getType() {
        return "This is a Audi Car";
    }
}

class BMW implements Car {
    public function getType() {
        return "This is an BMW Car";
    }
}

// Step 3: Factory Class
class CarFactory {
    public static function createCar($carType) {
        switch ($carType) {
            case 'audi':
                return new Audi();
            case 'bmw':
                return new BMW();
            default:
                throw new Exception("Invalid Car Type");
        }
    }
}

// Step 4: Client Code
try {
    $myCar = CarFactory::createCar('audi');
    echo $myCar->getType(); // Output: This is a Audi Car
} catch (Exception $e) {
    echo $e->getMessage();
}

?>
```

{% endcode %}

### **Laravel ও Django কোথায় Factory Pattern ব্যবহার করে?**

<table data-header-hidden><thead><tr><th width="134"></th><th></th></tr></thead><tbody><tr><td><strong>Framework</strong></td><td><strong>ব্যবহার</strong></td></tr><tr><td>Laravel</td><td>Model Factory, Queue System, Service Container</td></tr><tr><td>Django</td><td>ORM QuerySet Factory, Middleware Factory</td></tr></tbody></table>

#### **Laravel-এ**

* Model Factory: যখন ডাটা ফেক করতে হয়, তখন `factory()` ব্যবহার করে লারাভেল অবজেক্ট তৈরি করে।
* Queue System: Queue Jobs-এর জন্য Laravel Factory Design Pattern ব্যবহার করে।
* Service Container: Dependency Injection ব্যবহারের সময় এটি ফ্যাক্টরি প্যাটার্ন ব্যবহার করে।

```php
User::factory()->count(10)->create();
```

#### **Django-তে**

* QuerySet Factory: Django-এর ORM QuerySet যখন `filter()`, `get()` ব্যবহার করে, তখন ফ্যাক্টরি প্যাটার্ন কাজ করে।
* Middleware Factory: Middleware ব্যবহার করার সময় Django ফ্যাক্টরি প্যাটার্ন অনুসরণ করে।

```python
users = User.objects.filter(is_active=True)
```

Factory Design Pattern অনেক বড় প্রজেক্টে অবজেক্ট ক্রিয়েশন ম্যানেজ করতে সাহায্য করে। Laravel ও Django দুটোই তাদের বিভিন্ন ফিচারে Factory Pattern ব্যবহার করে, কারণ এটি Scalability ও Maintainability বাড়ায়।
