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

# Facade Design Pattern

ধরো, তুমি একটা বড়সড় রেস্টুরেন্টে গেছো খেতে। রেস্টুরেন্টে প্রচুর সেকশন—একজন শেফ রান্না করে, একজন ওয়েটার খাবার আনে, ক্যাশিয়ার বিল নেয়, আর কেউ একজন অর্ডার ম্যানেজ করে। এখন তুমি যদি ওয়েটারের কাছে অর্ডার দাও, সে শেফের কাছে পাঠাবে, রান্না হলে সেটা এনে দেবে, এবং শেষে বিলও ম্যানেজ করবে। তুমি কিন্তু শেফের সাথে আলাদা করে কথা বলো না, ক্যাশিয়ারের সাথে দামাদামি করো না। তোমার জন্য ওয়েটার একটা সহজ ইন্টারফেসের মতো কাজ করে—একটা Facade।

### **Facade Design Pattern কী?**

**Facade Design Pattern** এমন একটা ডিজাইন প্যাটার্ন যেখানে অনেকগুলো জটিল সিস্টেম বা ক্লাসের ফাংশনালিটি একটা সাধারণ ইন্টারফেস বা API দিয়ে এক্সপোজ করা হয়। ফলে ব্যবহারকারী বা ডেভেলপার সরাসরি কমপ্লেক্স সিস্টেমের ভেতরের সবকিছু নিয়ে ভাবতে হয় না, বরং একটা সহজ ইন্টারফেসের মাধ্যমে কাজ করতে পারে।

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

* যখন তোমার সিস্টেমের অনেকগুলো ক্লাস বা সাবসিস্টেম আছে, এবং তুমি চাইছো এগুলো সহজভাবে এক্সেস করা যাক।
* যখন কোনো ক্লায়েন্টকে জটিল লজিক হ্যান্ডেল করতে না দিয়ে সহজ API দেওয়া দরকার।
* যখন সাবসিস্টেমগুলোর কোড মোডিফাই না করেই নতুন ইন্টারফেস তৈরি করতে হবে।

***

### **উদাহরণ**

ধরো, তুমি একটা **Payment System** বানাচ্ছো, যেখানে **BankPayment, PaypalPayment, BitcoinPayment** নামের আলাদা আলাদা ক্লাস আছে। এখন ইউজার যদি সরাসরি এগুলোর সাথে কাজ করতে যায়, তাহলে পুরো প্রক্রিয়া জটিল হয়ে যাবে। তাই আমরা **Facade Pattern** ব্যবহার করব:

{% code lineNumbers="true" %}

```php
<?php
// Subsystems (জটিল ক্লাসগুলো)
class BankPayment {
    public function pay($amount) {
        return "Paid $amount via Bank Transfer.";
    }
}

class PaypalPayment {
    public function pay($amount) {
        return "Paid $amount via PayPal.";
    }
}

class BitcoinPayment {
    public function pay($amount) {
        return "Paid $amount via Bitcoin.";
    }
}

// Facade (সহজ ইন্টারফেস)
class PaymentFacade {
    private $bank;
    private $paypal;
    private $bitcoin;

    public function __construct() {
        $this->bank = new BankPayment();
        $this->paypal = new PaypalPayment();
        $this->bitcoin = new BitcoinPayment();
    }

    public function payWithBank($amount) {
        return $this->bank->pay($amount);
    }

    public function payWithPaypal($amount) {
        return $this->paypal->pay($amount);
    }

    public function payWithBitcoin($amount) {
        return $this->bitcoin->pay($amount);
    }
}

// Client Code
$payment = new PaymentFacade();
echo $payment->payWithPaypal(100); // Output: Paid 100 via PayPal.
```

{% endcode %}

এখানে `PaymentFacade` ক্লাস ব্যবহার করে আমরা পুরো পেমেন্ট সিস্টেমকে একটা সাধারণ ইন্টারফেসে এনে ফেলেছি। ইউজার আর আলাদা করে তিনটা ক্লাস নিয়ে চিন্তা করতে হবে না।

***

### **Drawbacks (দুর্বলতা)**

1. Facade বেশি ব্যবহৃত হলে কিছু ক্ষেত্রে **Overhead** বাড়িয়ে ফেলতে পারে।
2. যদি ভুলভাবে ডিজাইন করা হয়, তাহলে এটা **Tight Coupling** তৈরি করতে পারে, ফলে কোড মডিফাই করা কঠিন হয়ে যেতে পারে।
3. কিছু কিছু ক্ষেত্রে Facade ক্লাস **Single Point of Failure** হয়ে যায়, অর্থাৎ এটাতে সমস্যা হলে পুরো সাবসিস্টেম ভেঙে পড়তে পারে।

***

### **Laravel ও Django-তে Facade**

**Laravel:**

Laravel-এ Facade খুব জনপ্রিয়ভাবে ব্যবহৃত হয়। Laravel-এর **Facades** মূলত স্ট্যাটিক অ্যাক্সেসের মাধ্যমে সার্ভিস কন্টেইনারে থাকা ক্লাসগুলোর ইন্টারফেস তৈরি করে। যেমন,

{% code lineNumbers="true" %}

```php
use Illuminate\Support\Facades\DB;

DB::table('users')->get();
```

{% endcode %}

এখানে `DB` নিজে কোনো ক্লাস না, এটা একটা Facade, যা ব্যাকএন্ডে `DatabaseManager` ক্লাসের সাথে কাজ করে।

**Django:**

Django-তে Facade কম ব্যবহৃত হলেও কিছু ক্ষেত্রে `Django ORM` ও `Middleware` এক ধরনের Facade-এর মতো কাজ করে। যেমন,

{% code lineNumbers="true" %}

```python
from django.db import connection

connection.cursor()
```

{% endcode %}

এখানে `connection` পুরো Database API কে সহজে অ্যাক্সেস করার জন্য ব্যবহৃত হয়, যা ব্যাকএন্ডে আলাদা ডাটাবেজ ইঞ্জিনগুলোর সাথে কাজ করে।

***

#### Facade Design Pattern হলো এক ধরনের **Abstraction**, যা জটিল সিস্টেমকে সহজভাবে উপস্থাপন করে। Laravel এটাকে ব্যাপকভাবে ব্যবহার করে, যেখানে Django তুলনামূলক কম ব্যবহার করে। তবে সবক্ষেত্রে এটা প্রয়োগ করা উচিত নয়, কারণ এতে কিছু ওভারহেড বাড়তে পারে।
