Singleton Pattern

Creational Design Patterns - জাভায় ডিজাইন প্যাটার্ন (Design Patterns in Java) - Java Technologies

303

Singleton Pattern হল একটি Creational Design Pattern যা নিশ্চিত করে যে একটি ক্লাসের শুধুমাত্র একটিমাত্র ইনস্ট্যান্স (instance) তৈরি হয় এবং সেই ইনস্ট্যান্সটি পুরো সফটওয়্যার সিস্টেমে পুনরায় ব্যবহার করা যায়। এর মূল উদ্দেশ্য হলো ক্লাসের একটিমাত্র অবজেক্ট তৈরি করা এবং সেই অবজেক্টটি ব্যবহারের জন্য গ্লোবাল অ্যাক্সেস পেতে সিস্টেমের মধ্যে ছড়িয়ে দেয়া।

Singleton Pattern এর প্রয়োগ ক্ষেত্র:

  • যখন একসাথে কাজ করা বিভিন্ন কম্পোনেন্টের জন্য শুধুমাত্র একটি অবজেক্টের প্রয়োজন হয়।
  • যেমন: লগিং, কনফিগারেশন সেটিংস, ডাটাবেস কানেকশন পুল, থ্রেড পুল, বা কোনো অন্যান্য গ্লোবাল রিসোর্স।

1. Singleton Pattern এর বৈশিষ্ট্য

  • Single Instance: সিঙ্গেলটন প্যাটার্ন নিশ্চিত করে যে ক্লাসটির শুধু একটি ইনস্ট্যান্স থাকবে।
  • Global Access: এই একক ইনস্ট্যান্সটি পুরো অ্যাপ্লিকেশনের মধ্যে গ্লোবালি অ্যাক্সেস করা যাবে।
  • Lazy Initialization: ইনস্ট্যান্সটি কেবল তখনই তৈরি হবে, যখন সেটি প্রয়োজন হবে (এটা অপ্টিমাইজেশন হিসেবে কাজ করতে পারে)।

2. Singleton Pattern বাস্তবায়ন

2.1 Eager Initialization (প্রাথমিক ইনস্ট্যান্স তৈরি)

এই পদ্ধতিতে ইনস্ট্যান্স ক্লাস লোড হওয়ার সময়ই তৈরি হয়। এই পদ্ধতি সহজ, কিন্তু যদি ক্লাসটি কখনোই ব্যবহৃত না হয়, তাহলে এটি কিছুটা অপ্রয়োজনীয় মেমরি ব্যবহার করবে।

উদাহরণ:

public class Singleton {
    // ক্লাস লোডের সময় ইনস্ট্যান্স তৈরি
    private static final Singleton instance = new Singleton();

    // কনস্ট্রাক্টর প্রাইভেট, বাইরের ক্লাস থেকে ইনস্ট্যান্স তৈরি করা যাবে না
    private Singleton() {}

    // গেটার মেথড - ইনস্ট্যান্সটি রিটার্ন করবে
    public static Singleton getInstance() {
        return instance;
    }

    // অন্যান্য মেথড
    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}

class Main {
    public static void main(String[] args) {
        // একমাত্র ইনস্ট্যান্স অ্যাক্সেস করা
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();  // আউটপুট: Hello from Singleton!
    }
}

ব্যাখ্যা:

  • এখানে Singleton ক্লাসটি instance নামে একটি স্ট্যাটিক ভ্যারিয়েবল ধারণ করে, যা ক্লাস লোড হওয়ার সাথে সাথে তৈরি হয়।
  • getInstance() মেথডটি সেই ইনস্ট্যান্স রিটার্ন করে এবং showMessage() একটি সাধারণ মেথড যা ইনস্ট্যান্সের মাধ্যমে কল করা হয়।

2.2 Lazy Initialization (আলসা ইনস্ট্যান্স তৈরি)

এটি একটি উন্নত পদ্ধতি যেখানে ইনস্ট্যান্সটি কেবল তখনই তৈরি হয় যখন প্রথমবার getInstance() মেথডটি কল করা হয়। এই পদ্ধতিতে ডিফল্টভাবে ইনস্ট্যান্স তৈরি করা হয় না, বরং ক্লাস ব্যবহৃত হওয়ার সময় তা তৈরি হয়, যার ফলে মেমরি অপটিমাইজেশন হয়।

উদাহরণ:

public class Singleton {
    // সিঙ্গেলটন ইনস্ট্যান্স তৈরি করতে private static ভ্যারিয়েবল
    private static Singleton instance;

    // কনস্ট্রাক্টর প্রাইভেট, বাইরের ক্লাস থেকে ইনস্ট্যান্স তৈরি করা যাবে না
    private Singleton() {}

    // গেটার মেথড - ইনস্ট্যান্স তৈরি করবে যদি এটি আগে তৈরি না হয়ে থাকে
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();  // প্রথমবার ইনস্ট্যান্স তৈরি
        }
        return instance;
    }

    // অন্যান্য মেথড
    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}

class Main {
    public static void main(String[] args) {
        // একমাত্র ইনস্ট্যান্স অ্যাক্সেস করা
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();  // আউটপুট: Hello from Singleton!
    }
}

ব্যাখ্যা:

  • Lazy Initialization ব্যবহার করা হয়েছে, যেখানে ইনস্ট্যান্স কেবল তখনই তৈরি হয়, যখন প্রথমবার getInstance() মেথডটি কল করা হয়। এর ফলে মেমরি অপটিমাইজেশন করা যায়।

2.3 Thread-Safe Singleton (Thread-Safe সিঙ্গেলটন)

যখন মাল্টিথ্রেডেড পরিবেশে সিঙ্গেলটন ব্যবহার করা হয়, তখন সিঙ্গেলটন ক্লাসের ইনস্ট্যান্স তৈরির সময় Thread Safety নিশ্চিত করা জরুরি। একাধিক থ্রেড যদি একই সময়ে ইনস্ট্যান্স তৈরি করার চেষ্টা করে, তাহলে এটি একটি Concurrency Issue সৃষ্টি করতে পারে।

এটি সমাধান করার জন্য Double-Checked Locking প্যাটার্ন ব্যবহার করা হয়, যেখানে প্রথমে null চেক করা হয় এবং পরে সিঙ্ক্রোনাইজেশন করা হয়।

উদাহরণ:

public class Singleton {
    // ইনস্ট্যান্স স্ট্যাটিকভাবে তৈরি হবে না যতক্ষণ না প্রয়োজন
    private static volatile Singleton instance;

    // কনস্ট্রাক্টর প্রাইভেট
    private Singleton() {}

    // Thread-Safe getInstance() মেথড
    public static Singleton getInstance() {
        if (instance == null) { // প্রথম চেক
            synchronized (Singleton.class) { // সিঙ্ক্রোনাইজড ব্লক
                if (instance == null) { // দ্বিতীয় চেক
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // অন্যান্য মেথড
    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}

class Main {
    public static void main(String[] args) {
        // একমাত্র ইনস্ট্যান্স অ্যাক্সেস করা
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();  // আউটপুট: Hello from Singleton!
    }
}

ব্যাখ্যা:

  • এখানে, Double-Checked Locking ব্যবহার করা হয়েছে, যেখানে প্রথমে instance == null চেক করা হয় এবং পরবর্তীতে সিঙ্ক্রোনাইজড ব্লক ব্যবহার করা হয় যাতে একাধিক থ্রেড একসাথে ইনস্ট্যান্স তৈরি করতে না পারে।

3. Advantages of Singleton Pattern

  1. Controlled Access: সিঙ্গেলটন প্যাটার্ন নিশ্চিত করে যে একটি ক্লাসের শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হবে এবং সেই ইনস্ট্যান্সটি পুরো সিস্টেমে একযোগভাবে ব্যবহৃত হবে।
  2. Global Access Point: সিঙ্গেলটন ক্লাসের ইনস্ট্যান্সটি গ্লোবালি অ্যাক্সেস করা যায়।
  3. Lazy Initialization: শুধুমাত্র যখন প্রয়োজন হবে তখনই ইনস্ট্যান্স তৈরি করা হয়, যা মেমরি অপটিমাইজেশন করতে সাহায্য করে।
  4. Thread Safety: সঠিকভাবে সিঙ্ক্রোনাইজড করা হলে, এটি মাল্টিথ্রেডেড অ্যাপ্লিকেশনের জন্য সঠিকভাবে কাজ করবে।

4. Disadvantages of Singleton Pattern

  1. Global State: সিঙ্গেলটন ক্লাসের ইনস্ট্যান্স গ্লোবাল অ্যাক্সেস পয়েন্ট হিসেবে কাজ করার কারণে এটি গ্লোবাল স্টেট তৈরি করতে পারে, যা প্রোগ্রামের টেস্টিং এবং মেন্টেনেন্সকে জটিল করতে পারে।
  2. Difficulty in Unit Testing: সিঙ্গেলটন প্যাটার্ন প্রোগ্রামিং টেস্টিংয়ে সমস্যা সৃষ্টি করতে পারে, কারণ এটি সিঙ্গেল ইনস্ট্যান্স সরবরাহ করে, যা পরীক্ষার সময় পরিবর্তন করা কঠিন হতে পারে।
  3. Overuse: সিঙ্গেলটন প্যাটার্নের অতিরিক্ত ব্যবহার, বিশেষত যেখানে একাধিক ইনস্ট্যান্সের প্রয়োজন, অ্যাপ্লিকেশনের ডিজাইনকে জটিল করে তোলে।

Singleton Pattern হল একটি সাধারণ কিন্তু অত্যন্ত কার্যকরী ডিজাইন প্যাটার্ন যা নিশ্চিত করে যে একটি ক্লাসের একমাত্র ইনস্ট্যান্স থাকবে এবং সেটি পুরো সিস্টেমে শেয়ার করা যাবে। এটি ডেটাবেস কানেকশন পুল, লগিং, কনফিগারেশন সেটিংস এবং অনেক ধরনের গ্লোবাল রিসোর্স পরিচালনায় ব্যবহার করা হয়। Java তে সিঙ্গেলটন প্যাটার্ন বাস্তবায়ন করতে হলে Thread Safety, Lazy Initialization এবং Eager Initialization সম্পর্কে ভালোভাবে বুঝতে হবে।

Content added By
Promotion

Are you sure to start over?

Loading...