1. Home
  2. ডিজাইন প্যাটার্ন
  3. পরিচিতি:
  4. Singleton Pattern

Singleton Pattern

Singleton Pattern হলো একটি ডিজাইন প্যাটার্ন যা এমন একটি ক্লাস তৈরি করতে ব্যবহৃত হয় যার একটি নির্দিষ্ট প্রজেক্ট বা অ্যাপ্লিকেশন জুড়ে শুধুমাত্র একটি অবজেক্ট বা ইনস্ট্যান্স থাকে। অর্থাৎ, একই ক্লাস থেকে নতুন অবজেক্ট তৈরি করতে চাইলেও, এটি নতুন অবজেক্ট তৈরি না করে প্রথমবারের ইনস্ট্যান্স করা অবজেক্টটি রিটার্ন করে। এই প্যাটার্নটি এমন পরিস্থিতিতে দরকার হয় যখন কোনো রিসোর্সের জন্য শুধুমাত্র একটিমাত্র ইনস্ট্যান্স থাকা জরুরি।

গল্পের মাধ্যমে Singleton Pattern বোঝানো

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

এভাবে, বিল্ডিংয়ের স্ক্যানারকে আমরা Singleton Pattern এর উদাহরণ হিসেবে দেখতে পারি যেখানে প্রতিটি দরজা ও ফ্লোরের জন্য একক ইনস্ট্যান্সের স্ক্যানারই পুনরায় ব্যবহার হচ্ছে।

বাস্তব উদাহরণ

১. ডেটাবেস কানেকশন ম্যানেজার: একটি বড় অ্যাপ্লিকেশনে বিভিন্ন জায়গা থেকে ডেটাবেসে সংযোগের প্রয়োজন হয়। প্রতিবার নতুন করে কানেকশন তৈরি করলে এটি সময় এবং মেমরি অপচয় করবে। Singleton Pattern ব্যবহার করে একটি ক্লাস থেকে একবারই ডেটাবেস কানেকশন তৈরি করা যায় এবং সবার জন্য সেটি ব্যবহৃত হয়।

২. লগার (Logger): বড় প্রজেক্টে একটি সাধারণ লগার থাকা প্রয়োজন যা প্রতিটি মডিউল থেকে অ্যাপ্লিকেশনের লগগুলি ধরে রাখতে পারে। আলাদা আলাদা লগার তৈরি করার পরিবর্তে একটি Logger ক্লাসকে Singleton হিসেবে ব্যবহার করা হয়।

Singleton Pattern এর সুবিধা

  • মেমরি এবং রিসোর্স অপচয় কমায়: শুধু একবারই ইনস্ট্যান্স তৈরি হয়।
  • সহজে মেইনটেইনেবল: একাধিক ইনস্ট্যান্স নিয়ে চিন্তা করতে হয় না।
  • গ্লোবাল এক্সেস: অ্যাপ্লিকেশনের যেকোনো স্থান থেকে একক ইনস্ট্যান্সের এক্সেস পাওয়া যায়।

গল্প দিয়ে ব্যাখ্যা

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

এই একক কন্ট্রোল রুম হলো Singleton Pattern এর একটি উদাহরণ যেখানে শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হয় এবং সবার জন্য তা শেয়ার করা হয়।

বাস্তব উদাহরণ: Singleton Pattern এর Python কোড

এবার দেখা যাক কিভাবে Python এ Singleton Pattern ব্যবহার করা যায়। উদাহরণস্বরূপ, আমরা একটি SingletonLogger ক্লাস তৈরি করবো যা লগ সংরক্ষণ করে।

__new__ মেথড

__new__ একটি পাইথনের ডিফল্ট বা বিল্ট-ইন মেথড যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়। এটি ক্লাসের কনস্ট্রাক্টর হিসেবে কাজ করে, অর্থাৎ এটি ক্লাসের একটি নতুন ইনস্ট্যান্স তৈরি করে এবং মেমোরিতে সংরক্ষণ করে। __new__ মেথড সাধারণত এমন সময়ে ওভাররাইড করা হয় যখন আপনি কোনো ক্লাসের ইনস্ট্যান্স তৈরি নিয়ন্ত্রণ করতে চান, যেমন Singleton Pattern বাস্তবায়নের সময়।

__new__ মেথড কিভাবে কাজ করে?

  • __new__ ক্লাসের প্রথম মেথড যা অবজেক্ট তৈরির সময় চালিত হয়। এটি __init__ এর আগে চালিত হয়।
  • __new__ মেথডে প্রায়শই cls প্যারামিটার দেওয়া হয়, যা নিজেই ক্লাসটিকে রেফারেন্স করে (যেমনটা self ইনস্ট্যান্সকে রেফারেন্স করে)।
  • যদি __new__ মেথডে নতুন অবজেক্ট তৈরি করা হয়, তাহলে তা __init__ মেথডে পাস করা হয় এবং __init__ এর মাধ্যমে সেটি ইনিশিয়ালাইজ হয়।
class SingletonLogger:
    _instance = None  # এখানে একবার মাত্র ইনস্ট্যান্স সংরক্ষণ করা হবে

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(SingletonLogger, cls).__new__(cls)
            print("Creating new instance of SingletonLogger")
        return cls._instance

    def log(self, message):
        print(f"Log: {message}")

# একই ক্লাস থেকে দুইবার অবজেক্ট তৈরি করা হচ্ছে
logger1 = SingletonLogger()
logger2 = SingletonLogger()

# লোগার ব্যবহার করে মেসেজ প্রিন্ট
logger1.log("First log message")
logger2.log("Second log message")

# চেক করা হচ্ছে যে logger1 এবং logger2 একই ইনস্ট্যান্স কি না
print(logger1 is logger2)  # Output: True

ব্যাখ্যা

  • _instance: এই ভ্যারিয়েবলটি প্রথমবার SingletonLogger ক্লাসের ইনস্ট্যান্স তৈরি হলে সেটি সংরক্ষণ করে রাখে।
  • new: এই মেথডটি নিশ্চিত করে যে, শুধুমাত্র প্রথমবার SingletonLogger ক্লাসের একটি ইনস্ট্যান্স তৈরি হবে, এবং পরবর্তীতে সেই ইনস্ট্যান্সই রিটার্ন করা হবে।
  • logger1 এবং logger2: এই দুইটি ভেরিয়েবল একই অবজেক্টকে রেফারেন্স করছে, যা Singleton Pattern এর প্রধান বৈশিষ্ট্য।

Singleton Pattern এর সুবিধা

  • মেমরি অপচয় কমানো: শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হওয়ায় মেমরি সাশ্রয় হয়।
  • গ্লোবাল অ্যাক্সেস: পুরো প্রজেক্টে একক ইনস্ট্যান্স থাকায় সেটি সহজে এক্সেস করা যায়।

সংক্ষেপে

Singleton Pattern এমন পরিস্থিতিতে খুব কার্যকর যেখানে একটি নির্দিষ্ট অবজেক্টের একক ইনস্ট্যান্স থাকা দরকার, যেমন কনফিগারেশন সেটিংস বা লগার।

How can we help?