কম্পিউটার টিউটোরিয়াল

C#-এ সিঙ্গলটন প্যাটার্ন ইমপ্লিমেন্টেশন

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

ক্লাসিক সিঙ্গলটন (লেজি ইনিশিয়ালাইজেশন - থ্রেড-আনসেফ)

public class Singleton
{
    private static Singleton _instance = null;
    
    private Singleton() { } // প্রাইভেট কনস্ট্রাক্টর
    
    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Singleton();
            return _instance;
        }
    }
    
    public void Display() => Console.WriteLine("সিঙ্গলটন ইনস্ট্যান্স");
}
⚠️ থ্রেড-আনসেফ: মাল্টিথ্রেডেড এনভায়রনমেন্টে একাধিক ইনস্ট্যান্স তৈরি হতে পারে।

থ্রেড-সেফ সিঙ্গলটন (Double-Check Locking)

public class Singleton
{
    private static volatile Singleton _instance = null;
    private static readonly object _lock = new object();
    
    private Singleton() { }
    
    public static Singleton Instance
    {
        get
        {
            if (_instance == null) // প্রথম চেক (ফাস্ট পাথ)
            {
                lock (_lock) // লক
                {
                    if (_instance == null) // দ্বিতীয় চেক
                        _instance = new Singleton();
                }
            }
            return _instance;
        }
    }
}

সadiaলিশন: Static Initialization (থ্রেড-সেফ এবং সহজ)

public sealed class Singleton
{
    // CLR গ্যারান্টি দেয় যে এটি একবারই ইনিশিয়ালাইজ হবে
    private static readonly Singleton _instance = new Singleton();
    
    // এক্সপ্লিসিট স্ট্যাটিক কনস্ট্রাক্টর যোগ করলে লেজি হয়ে যায়
    static Singleton() { }
    
    private Singleton() { }
    
    public static Singleton Instance => _instance;
    
    public void Display() => Console.WriteLine("সিঙ্গলটন ইনস্ট্যান্স");
}

সর্বোত্তম: Lazy<T> ব্যবহার (নেট 4.0+, থ্রেড-সেফ, লেজি)

using System;

public sealed class Singleton
{
    private static readonly Lazy<Singleton> _instance = 
        new Lazy<Singleton>(() => new Singleton(), true); // true = থ্রেড-সেফ
    
    private Singleton() { }
    
    public static Singleton Instance => _instance.Value;
    
    public void Display() => Console.WriteLine("সিঙ্গলটন ইনস্ট্যান্স");
}

সম্পূর্ণ উদাহরণ (Static Initialization ভার্সন)

using System;

public sealed class Singleton
{
    public static readonly Singleton Instance = new Singleton();
    
    private Singleton() { }
    
    public void Display()
    {
        Console.WriteLine("সিঙ্গলটন মেথড কল হয়েছে");
    }
}

class Demo
{
    public static void Main()
    {
        Singleton.Instance.Display();
    }
}

আউটপুট

সিঙ্গলটন মেথড কল হয়েছে

সিঙ্গলটন অ্যান্টি-প্যাটার্ন এড়ান

  • গ্লোবাল স্টেট তৈরি করে (টেস্টিং কঠিন হয়)
  • ডিপেন্ডেন্সি হাইড করে (কনস্ট্রাক্টর ইনজেকশন ভালো)
  • টাইট কাপলিং তৈরি করে
  • সিঙ্গল রেসপন্সিবিলিটি প্রিন্সিপল লঙ্ঘন করতে পারে

আধুনিক অ্যাল্টার্নেটিভ: Dependency Injection

// ASP.NET Core-এ
services.AddSingleton<IMyService, MyService>(); // কন্টেইনার ম্যানেজ করবে সিঙ্গলটন লাইফসাইকেল

// কনস্ট্রাক্টর ইনজেকশন
public class MyController
{
    private readonly IMyService _service;
    public MyController(IMyService service) => _service = service;
}

চেকলিস্ট: সঠিক সিঙ্গলটন বানাতে

  • [x] sealed ক্লাস (ইনহেরিট্যান্স ব্লক)
  • [x] private কনস্ট্রাক্টর
  • [x] static readonly ফিল্ড বা Lazy<T>
  • [x] পাবলিক স্ট্যাটিক প্রপার্টি/মেথড এক্সেসর
  • [x] থ্রেড-সেফ्टी নিশ্চিত (static init বা Lazy<T>)
  1. অ্যান্ড্রয়েডে সিঙ্গলটন ক্লাস কীভাবে ব্যবহার করবেন?

  2. C# Console ক্লাস

  3. জাভাতে ক্লাসকে সিঙ্গলটন বানান

  4. পাইথনে সিঙ্গলটন ক্লাস কীভাবে তৈরি করবেন?