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

# Singleton Design Pattern

Singleton Design Pattern হচ্ছে একটি Popular and Most Used Design Pattern যা শুধুমাত্র একটিই ইনস্ট্যান্স (instance) তৈরি করতে দেয় এবং সেই ইনস্ট্যান্সটি অ্যাপ্লিকেশনের সমস্ত জায়গায় শেয়ার করা হয়। এটি মূলত সেই ধরনের ক্লাসের জন্য ব্যবহৃত হয় যেগুলোর শুধুমাত্র একটি একক অবজেক্ট (object) থাকা দরকার। যখনই আপনার প্রয়োজন হবে ঐ একক অবজেক্টের, তখনই আপনি তা ব্যবহার করতে পারবেন।

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

কিছু কিছু ক্ষেত্রে, যেমন **ডাটাবেস কানেকশন , লগিং সিস্টেম** বা **কনফিগারেশন সেটিংস**,ইত্যাদি একটি একক অবজেক্টেরই প্রয়োজন হয় যাতে এটি সবখানে একইভাবে কাজ করে। এটি একাধিক ইনস্ট্যান্স তৈরি করতে বাধা দেয়, যা অনেক ক্ষেত্রে অবাঞ্ছিত হতে পারে।

### কীভাবে কাজ করে ?

Singleton Pattern কাজ করে একটি ক্লাসের মধ্যে এমন একটি মেকানিজম ব্যবহার করে যা নিশ্চিত করে যে সেই ক্লাসের একটি মাত্র ইনস্ট্যান্স থাকবে। যদি আপনি ঐ ক্লাসের আরেকটি ইনস্ট্যান্স তৈরি করার চেষ্টা করেন, তা হলে সিস্টেম শুধুমাত্র একটিই অবজেক্ট রিটার্ন করবে।

এটি সাধারণত তিনটি গুরুত্বপূর্ণ পয়েন্টের উপর ভিত্তি করে কাজ করে:

1. **Private Constructor:** ক্লাসের কনস্ট্রাক্টরটি প্রাইভেট (private) রাখা হয়, যাতে বাইরের কোড সরাসরি নতুন অবজেক্ট তৈরি না করতে পারে।
2. **Static Instance:** একটি স্ট্যাটিক ভেরিয়েবল (static variable) রাখা হয় যা ক্লাসের একমাত্র ইনস্ট্যান্স ধারণ করে।
3. **Public Access Method:** একটি পাবলিক মেথড থাকে (যেমন `getInstance()`) যা ক্লাসের একমাত্র ইনস্ট্যান্স রিটার্ন করে।

### উদাহরণ

ধরা যাক, আমাদের একটি ক্লাস আছে যা ডাটাবেস কানেকশন ম্যানেজ করে। ডাটাবেস কানেকশনকে একাধিক স্থানে ব্যবহারের জন্য, আমরা Singleton Pattern ব্যবহার করতে পারি:

{% code lineNumbers="true" %}

```php
<?php

class DatabaseConnection {
    // স্ট্যাটিক প্রপার্টি যা একমাত্র ইনস্ট্যান্স ধারণ করবে
    private static $instance = null;
    
    // কনস্ট্রাক্টর প্রাইভেট, যাতে বাইরের কোড থেকে নতুন ইনস্ট্যান্স তৈরি না করা যায়
    private function __construct() {
        echo "Database connection established.";
    }
    
    // ক্লোন মেথড প্রাইভেট যাতে ক্লোন করা না যায়
    private function __clone() {}
    
    // স্ট্যাটিক মেথড যা একমাত্র ইনস্ট্যান্স রিটার্ন করবে
    public static function getInstance() {
        // যদি ইনস্ট্যান্স না থাকে, তাহলে নতুন ইনস্ট্যান্স তৈরি হবে
        if (self::$instance === null) {
            self::$instance = new DatabaseConnection();
        }
        return self::$instance;
    }
}

// ব্যবহার উদাহরণ
$db1 = DatabaseConnection::getInstance();  // প্রথমবারেই কানেকশন তৈরি হবে
$db2 = DatabaseConnection::getInstance();  // দ্বিতীয়বারে একই ইনস্ট্যান্স রিটার্ন হবে

// যাচাই করা হবে যে db1 এবং db2 একই ইনস্ট্যান্স কি না
if ($db1 === $db2) {
    echo "Both are the same instance.";  // True, কারণ তারা একই ইনস্ট্যান্স
}

?>
```

{% endcode %}

### বাস্তব জীবনের উদাহরণ

ধরা যাক, আপনি একটি একক **Configuration Manager** চান যা পুরো অ্যাপ্লিকেশনের কনফিগারেশন পরিচালনা করবে। এরকম ক্ষেত্রে, আপনি একটিই ইনস্ট্যান্স রাখবেন যাতে কনফিগারেশন সেটিংস এক জায়গায় থাকবে এবং অ্যাপ্লিকেশন জুড়ে একমাত্র কনফিগারেশন ব্যবহার হবে।

### Advantages

1. **Resource Optimization:** শুধুমাত্র একটিই ইনস্ট্যান্স তৈরি হওয়ার কারণে সিস্টেমের রিসোর্স বাঁচে।
2. **Consistency:** একটিই অবজেক্ট ব্যবহারের মাধ্যমে ডেটা এবং স্টেটের মধ্যে কনসিস্টেন্সি বজায় থাকে।
3. **Global Access:** অ্যাপ্লিকেশনের যেকোনো জায়গা থেকে একটিই ইনস্ট্যান্স ব্যবহার করা সম্ভব।

### Limitations

* Singleton Pattern বেশিরভাগ ক্ষেত্রেই **testing** এবং **scalability** এর জন্য সমস্যার সৃষ্টি করতে পারে।
* একাধিক থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন সমস্যা হতে পারে যদি Singleton Pattern সঠিকভাবে প্রয়োগ না করা হয়।

**Singleton Design Pattern** হলো একটি Effective Pattern যখন আপনি চান শুধুমাত্র একটিই ইনস্ট্যান্স তৈরি হোক এবং সেটি অ্যাপ্লিকেশনের মধ্যে সারা জীবনের জন্য ব্যবহৃত হোক। এটি রিসোর্স অপটিমাইজেশন, কনসিস্টেন্সি এবং সহজ অ্যাক্সেস প্রদান করে। তবে এটি সাবধানে ব্যবহার করা উচিত, কারণ এর কিছু সীমাবদ্ধতা আছে।

{% hint style="info" %}
References for the **Singleton Design Pattern**

* [Refactoring Guru - Singleton Design Pattern](https://refactoring.guru/design-patterns/singleton)
* [AlgoMaster Blog - Singleton Design Pattern](https://blog.algomaster.io/p/singleton-design-pattern)
* [GeeksforGeeks - Singleton Design Pattern](https://www.geeksforgeeks.org/singleton-design-pattern/)
  {% endhint %}
