C++
सिंगलटन डिजाइन पैटर्न
खोज…
टिप्पणियों
एक सिंगलटन एक वर्ग को सुनिश्चित करने के लिए डिज़ाइन किया गया है जिसका केवल एक ही उदाहरण है और इसे वैश्विक पहुंच प्रदान करता है। यदि आपको केवल एक उदाहरण या सुविधाजनक वैश्विक पहुंच की आवश्यकता है, लेकिन दोनों नहीं, तो सिंगलटन की ओर रुख करने से पहले अन्य विकल्पों पर विचार करें।
वैश्विक चर कोड के बारे में तर्क करना कठिन बना सकते हैं। उदाहरण के लिए, यदि एक कॉलिंग फ़ंक्शन एक सिंगलटन से प्राप्त होने वाले डेटा से खुश नहीं है, तो आपको अब नीचे ट्रैक करना होगा कि पहली बार में सिंगलटन खराब डेटा क्या दे रहा है।
एकल भी युग्मन को प्रोत्साहित करते हैं , एक शब्द कोड के दो घटकों का वर्णन करने के लिए उपयोग किया जाता है जो एक साथ जुड़ जाते हैं और प्रत्येक घटक को आत्म-नियंत्रण के माप को कम करते हैं।
Singletons समसामयिक नहीं हैं। जब किसी वर्ग के पास वैश्विक दृष्टिकोण होता है, तो प्रत्येक थ्रेड में इसे एक्सेस करने की क्षमता होती है जिससे गतिरोध और दौड़ की स्थिति पैदा हो सकती है।
अंत में, आलसी इनिशियलाइज़ेशन गलत समय पर इनिशियलाइज़ होने पर परफॉरमेंस इश्यू का कारण बन सकता है। आलसी इनिशियलाइज़ेशन को हटाने से कुछ विशेषताएं भी दूर हो जाती हैं जो पहली बार में सिंगलटन को दिलचस्प बनाती हैं, जैसे बहुरूपता (उपवर्ग देखें)।
स्रोत: गेम प्रोग्रामिंग पैटर्न रॉबर्ट निस्ट्रॉम द्वारा
आलसी प्रारंभिक
इस उदाहरण को Q & A
खंड से हटा दिया गया है: http://stackoverflow.com/a/1008289/3807729
गारंटीकृत विनाश सिंगलटन के साथ आलसी के लिए एक सरल डिजाइन के लिए यह लेख देखें:
क्या कोई भी मुझे c ++ में सिंगलटन का नमूना प्रदान कर सकता है?
क्लासिक आलसी ने सिंगलटन का मूल्यांकन किया और सही ढंग से नष्ट कर दिया।
class S
{
public:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
S() {}; // Constructor? (the {} brackets) are needed here.
// C++ 03
// ========
// Dont forget to declare these two. You want to make sure they
// are unacceptable otherwise you may accidentally get copies of
// your singleton appearing.
S(S const&); // Don't Implement
void operator=(S const&); // Don't implement
// C++ 11
// =======
// We can use the better technique of deleting the methods
// we don't want.
public:
S(S const&) = delete;
void operator=(S const&) = delete;
// Note: Scott Meyers mentions in his Effective Modern
// C++ book, that deleted functions should generally
// be public as it results in better error messages
// due to the compilers behavior to check accessibility
// before deleted status
};
इस लेख को देखें कि एक सिंगलटन का उपयोग कब करना है: (अक्सर नहीं)
सिंगलटन: इसका उपयोग कैसे किया जाना चाहिए
आरंभीकरण क्रम के बारे में यह दो लेख देखें और कैसे सामना करें:
स्थैतिक चर आरंभीकरण क्रम
सी ++ स्थैतिक आरंभीकरण आदेश समस्याओं का पता लगाना
जीवनकाल का वर्णन करने वाला यह लेख देखें:
C ++ फ़ंक्शन में एक स्थिर चर का जीवनकाल क्या है?
इस लेख को देखें जिसमें सिंग्लेट्स के कुछ सूत्रणों पर चर्चा की गई है:
GetInstance विधि के स्थिर चर के रूप में घोषित सिंगलटन उदाहरण
इस लेख को देखें जो बताता है कि डबल चेक किया गया लॉकिंग C ++ पर काम क्यों नहीं करेगा:
सभी सामान्य अपरिभाषित व्यवहार क्या हैं जिनके बारे में C ++ प्रोग्रामर को पता होना चाहिए?
उपवर्गों
class API
{
public:
static API& instance();
virtual ~API() {}
virtual const char* func1() = 0;
virtual void func2() = 0;
protected:
API() {}
API(const API&) = delete;
API& operator=(const API&) = delete;
};
class WindowsAPI : public API
{
public:
virtual const char* func1() override { /* Windows code */ }
virtual void func2() override { /* Windows code */ }
};
class LinuxAPI : public API
{
public:
virtual const char* func1() override { /* Linux code */ }
virtual void func2() override { /* Linux code */ }
};
API& API::instance() {
#if PLATFORM == WIN32
static WindowsAPI instance;
#elif PLATFORM = LINUX
static LinuxAPI instance;
#endif
return instance;
}
इस उदाहरण में, एक साधारण संकलक स्विच API
वर्ग को उपयुक्त उपवर्ग में बांधता है। इस तरह, API
को प्लेटफ़ॉर्म-विशिष्ट कोड पर युग्मित किए बिना पहुँचा जा सकता है।
धागा-सुरक्षित सिंगेटन
C ++ 11 मानक गारंटी देते हैं कि फ़ंक्शन स्कोप ऑब्जेक्ट्स का इनिशियलाइज़ेशन एक सिंक्रनाइज़ तरीके से प्रारंभ किया जाता है। इसका उपयोग आलसी प्रारंभ के साथ एक थ्रेड-सुरक्षित सिंगलटन को लागू करने के लिए किया जा सकता है ।
class Foo
{
public:
static Foo& instance()
{
static Foo inst;
return inst;
}
private:
Foo() {}
Foo(const Foo&) = delete;
Foo& operator =(const Foo&) = delete;
};
स्थैतिक विखंडन-सुरक्षित सिंगलटन।
कई स्टैटिक ऑब्जेक्ट्स के साथ समय होता है जहां आपको यह गारंटी देने में सक्षम होने की आवश्यकता होती है कि सिंगलटन तब तक नष्ट नहीं होगा जब तक कि सिंगलटन का उपयोग करने वाले सभी स्थिर ऑब्जेक्ट्स को इसकी आवश्यकता नहीं है।
इस स्थिति में std::shared_ptr
का उपयोग सभी उपयोगकर्ताओं के लिए सिंगलटन को जीवित रखने के लिए किया जा सकता है, यहां तक कि जब प्रोग्राम के अंत में स्थिर डिस्ट्रक्टर्स को बुलाया जा रहा है:
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static std::shared_ptr<Singleton> instance()
{
static std::shared_ptr<Singleton> s{new Singleton};
return s;
}
private:
Singleton() {}
};
नोट: यह उदाहरण Q & A अनुभाग में यहाँ एक उत्तर के रूप में दिखाई देता है।