सिंगलटन डिज़ाइन पैटर्न
सिंगलटन डिज़ाइन पैटर्न एक सॉफ्टवेयर डिज़ाइन सिद्धांत है जिसका उपयोग किसी क्लास के इंस्टेंशिएशन को एक ऑब्जेक्ट तक सीमित करने के लिए किया जाता है। यह तब उपयोगी होता है जब पूरे सिस्टम में कार्यों को समन्वयित करने के लिए ठीक एक ऑब्जेक्ट की आवश्यकता होती है। उदाहरण के लिए, यदि आप एक लॉगर का उपयोग कर रहे हैं जो फाइल में लॉग लिखता है, तो आप ऐसा लॉगर बनाने के लिए सिंगलटन क्लास का उपयोग कर सकते हैं।
क्लासिक कार्यान्वयन
#include <iostream>
using namespace std;
class Singleton {
static Singleton* instance;
int data;
// प्राइवेट कंस्ट्रक्टर ताकि कोई ऑब्जेक्ट न बनाया जा सके
Singleton() {
data = 0;
}
public:
static Singleton* getInstance() {
if (!instance)
instance = new Singleton;
return instance;
}
int getData() {
return this->data;
}
void setData(int data) {
this->data = data;
}
};
// पॉइंटर को इनिशियलाइज़ करें ताकि getInstance के पहले कॉल पर इनिशियलाइज़ हो सके
Singleton* Singleton::instance = 0;
int main() {
Singleton* s = Singleton::getInstance(); // सही: स्टेटिक मेथड कॉल
cout << s->getData() << endl;
s->setData(100);
cout << s->getData() << endl;
return 0;
}
आउटपुट
0 100
उपरोक्त कार्यान्वयन में समस्याएं
- थ्रेड-असेफ: मल्टी-थ्रेडेड वातावरण में रेस कंडीशन
- मेमोरी लीक: इंस्टेंस कभी डिलीट नहीं होता
- डिस्ट्रक्शन ऑर्डर: स्टेटिक डिस्ट्रक्शन ऑर्डर समस्या
बेहतर कार्यान्वयन: मेयर्स सिंगलटन (C++11 थ्रेड-सेफ)
#include <iostream>
using namespace std;
class Singleton {
private:
Singleton() : data(0) {} // प्राइवेट कंस्ट्रक्टर
~Singleton() {} // प्राइवेट डिस्ट्रक्टर
Singleton(const Singleton&) = delete; // कॉपी रोकें
Singleton& operator=(const Singleton&) = delete; // असाइनमेंट रोकें
Singleton(Singleton&&) = delete; // मूव रोकें
Singleton& operator=(Singleton&&) = delete;
int data;
public:
static Singleton& getInstance() {
static Singleton instance; // C++11: थ्रेड-सेफ इनिशियलाइज़ेशन
return instance;
}
int getData() const { return data; }
void setData(int d) { data = d; }
};
int main() {
Singleton& s = Singleton::getInstance();
cout << s.getData() << endl;
s.setData(100);
cout << s.getData() << endl;
return 0;
}
मेयर्स सिंगलटन के लाभ
- थ्रेड-सेफ: C++11 गारंटी देता है कि स्टेटिक लोकल वेरिएबल इनिशियलाइज़ेशन थ्रेड-सेफ है
- लेजी इनिशियलाइज़ेशन: पहली उपयोग पर बनाया जाता है
- ऑटोमैटिक क्लीनअप: प्रोग्राम एग्जिट पर डिस्ट्रॉय होता है
- कॉपी/मूव रोका गया:
= deleteके साथ - रेफरेंस रिटर्न करता है: नल चेक की आवश्यकता नहीं
अन्य विचार
- निर्भरता इंजेक्शन: सिंगलटन के बजाय निर्भरताओं को पास करने पर विचार करें
- टेस्टेबिलिटी: सिंगलटन्स टेस्टिंग को कठिन बनाते हैं (मॉक करना मुश्किल)
- ग्लोबल स्टेट: सिंगलटन्स अनिवार्य रूप से ग्लोबल स्टेट हैं - संयम से उपयोग करें