मैं सिंगलेट्स के बारे में बहुत कुछ पढ़ रहा हूं, जब उन्हें उपयोग करना चाहिए और उनका उपयोग नहीं करना चाहिए, और उन्हें सुरक्षित रूप से कैसे कार्यान्वित किया जाए। मैं सी ++ 11 में लिख रहा हूँ, और के रूप में this question.एक सिंगलटन के मेयर्स के कार्यान्वयन वास्तव में सिंगलटन
इस कार्यान्वयन में देखा एक सिंगलटन के मेयर की आलसी प्रारंभ कार्यान्वयन भर में आ गए हैं, है:
static Singleton& instance()
{
static Singleton s;
return s;
}
मैं समझता हूँ कि यह कैसे धागा सुरक्षित दूसरे से है एसओ पर यहां प्रश्न, लेकिन जो मुझे समझ में नहीं आता है यह वास्तव में एक सिंगलटन पैटर्न है। मैं अन्य भाषाओं में एकमात्र लागू कर दिया है, और ये हमेशा Wikipedia से इस उदाहरण की तरह कुछ खत्म:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo();
}
}
}
return instance;
}
}
जब मैं इस दूसरे उदाहरण को देखो, यह बहुत सहज ज्ञान युक्त है कि यह कैसे एक सिंगलटन है, के बाद से वर्ग एक रखती है खुद के एक उदाहरण के संदर्भ में, और केवल उस घटना को वापस लौटाता है। हालांकि, पहले उदाहरण में, मुझे समझ में नहीं आता कि यह ऑब्जेक्ट के मौजूदा दो उदाहरणों को कैसे रोकता है। तो मेरे प्रश्न हैं:
- पहला कार्यान्वयन एक सिंगलटन पैटर्न को कैसे लागू करता है? मुझे लगता है कि इसे स्थिर खोजशब्द के साथ करना है, लेकिन मुझे आशा है कि कोई मुझे हुड के नीचे क्या हो रहा है गहराई से समझा सकता है।
- इन दो कार्यान्वयन शैलियों के बीच, एक दूसरे के ऊपर बेहतर है? पक्ष और विपक्ष क्या होते हैं?
किसी भी मदद के लिए धन्यवाद,
सी ++ कोड, जिस तरह से आप इसका प्रतिनिधित्व करते हैं, उतना ही एक सिंगलटन नहीं है क्योंकि यह एक अच्छी तरह से प्रारंभिक वैश्विक वस्तु है। उनमें से किसी एक को रखने से आपको रोक नहीं है (एक और कार्य करें), और यह ठीक है। किसी को कुछ भी करने के लिए मजबूर करने में कोई बात नहीं है। यदि आप सिर्फ एक चाहते हैं, तो केवल एक ही बनाओ। –
'स्थैतिक सिंगलटन एस; 'पहली बार फ़ंक्शन को इस चर कहा जाता है जिसे प्रारंभ किया जाएगा और गैर स्थैतिक चर के विपरीत यह कार्य समाप्त होने के बाद नष्ट नहीं किया जाएगा। तो जब आप इसे दोबारा कॉल करेंगे तो यह अभी भी अस्तित्व में रहेगा, इसलिए एकमात्र निर्देश जिसे दूसरे (तीसरे, चौथे, ...) समय पर निष्पादित किया जाएगा, वह वापस आ जाएगा। – Borgleader
मुझे लगता है कि 'सिंगलटन' का निर्माता निजी है, इसलिए वास्तव में एक उदाहरण प्राप्त करने का एकमात्र तरीका 'instance()' फ़ंक्शन के माध्यम से है। –