1. সিঙ্গেলটন প্যাটার্ন কি
সিঙ্গেলটন প্যাটার্ন হল একটি স্রষ্টানিক ডিজাইন প্যাটার্ন যা একটি ক্লাসে শুধুমাত্র একটি ইনস্ট্যান্স থাকা নিশ্চিত করে এবং সেই ইনস্ট্যান্সের জন্য গ্লোবাল এক্সেস পয়েন্ট প্রদান করে। সিঙ্গেলটন প্যাটার্ন সাধারণভাবে সময় যায় যেখানে সম্পদের উপভোগ করতে হয় অথবা বিশেষ ইনস্ট্যান্সের অ্যাক্সেস নিয়ন্ত্রণ করতে হয়।
2. সিঙ্গেলটন প্যাটার্নের বৈশিষ্ট্য এবং সুবিধা
সিঙ্গেলটন প্যাটার্নের নিম্নলিখিত বৈশিষ্ট্য এবং সুবিধা রয়েছে:
- নিশ্চিত করে একটি ক্লাসে শুধুমাত্র একটি ইনস্ট্যান্স অবজেক্ট আছে
- বাইরের কোডের জন্য একটি গ্লোবাল অ্যাক্সেস পয়েন্ট প্রদান করে ইনস্ট্যান্স পেতে
- ইনস্ট্যান্সের পুনরায় সৃষ্টি মন্য হওয়া, সিস্টেম সম্পদ সংরক্ষণ করে
3. সিঙ্গেলটন প্যাটার্নের আবেদনের প্রসঙ্গ
সিঙ্গেলটন প্যাটার্ন নিম্নলিখিত আবেদনের প্রসঙ্গে উপযুক্ত:
- লগার: সিস্টেমের জন্য শুধুমাত্র একটি লগার থাকার নিশ্চিত করা এবং সনাক্ত লগ প্রতিরোধ করা।
- ডাটাবেস সংযোগ পুল: উচ্চ সাপ্তাহিকতা পরিবেশে, সিঙ্গেলটন প্যাটার্ন ব্যবহার করে ডাটাবেস সংযোগের সদাচার স্থাপন এবং পুনরায় সৃষ্টি প্রতিরোধ করা হয়।
4. গুলংতে সিঙ্গেলটন প্যাটার্নের অনুপাত করা
গুলংতে, সিঙ্গেলটন প্যাটার্ন প্রভিড করতে বিভিন্ন উপায় রয়েছে। নীচে দুটি সাধারণ বাস্তবায়নের উপায় রয়েছে।
4.1. অলস শুরু এবং সজীব বাস্তবায়নের অনুপাত
অলস শুরুতে তদন্তে অবজেক্ট তৈরি করে, যখন সে প্রথমবারের ব্যবহার হয়, সময়কে এবং সজীব বাস্তবায়ন করে প্রোগ্রাম শুরু হওয়ার সময়।
// অলস শুরু সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
package singleton
type Singleton struct {
}
var instance *Singleton
func GetInstance() *Singleton {
if instance == nil {
instance = &Singleton{}
}
return instance
}
// সজীব বাস্তবায়ন সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
package singleton
type Singleton struct {
}
var instance *Singleton = &Singleton{}
func GetInstance() *Singleton {
return instance
}
4.2. সিঙ্গেলটন প্যাটার্নে থ্রেড নিরাপত্তা সমস্যা
উপরের অলস শুরু বাস্তবায়ন পদ্ধতি বহুসঙ্গীন পরিবেশে সমস্যা রয়েছে কারণ একাধিক থ্রেড অক্ষম সময় প্রবেশ করতে পারে if instance == nil
অবস্থা, যা একাধিক ইনস্ট্যান্সের বাস্তবায়নে আনল সময়।
4.3. sync.Once ব্যবহার করে থ্রেড-নিরাপত্তা সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
sync.Once
ব্যবহার করা once.Do
ধারনাটি নিশ্চিত করে করে যে শুধুমাত্র একটি goroutine
ডিইখ্যুট কোড এক্সিকিউট করে, এবং তারা ধারনার নিরাপত্তা সমস্যাগুলি সমাধান করে।
// sync.Once ব্যবহার করে থ্রেড-নিরাপত্তা সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
package singleton
import (
"sync"
)
type Singleton struct {
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
4.4. sync.Mutex ব্যবহার করে থ্রেড-নিরাপত্তা অলস শুরু সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
থ্রেড-নিরাপত্তা অলস শুরু সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের একটি অন্য উপায় হল sync.Mutex
ব্যবহার করা এবং নিশ্চিত করা যা শুধুমাত্র একটি goroutine
মাত্র বাস্তবায়ন লক এবং এক্সিকিউট করে।
// sync.Mutex ব্যবহার করে থ্রেড-নিরাপত্তা অলস শুরু সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের অনুপাত
package singleton
import (
"sync"
)
type Singleton struct {
}
var instance *Singleton
var mu sync.Mutex
func GetInstance() *Singleton {
if instance == nil {
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &Singleton{}
}
}
return instance
}