मैंने सिंगलटन पैटर्न के बारे में अलग-अलग राय पढ़ी है। कुछ लोग यह कहते हैं कि इसे हर कीमत पर और अन्य लोगों से बचना चाहिए कि यह कुछ स्थितियों में उपयोगी हो सकता है।
एक स्थिति जिसमें मैं सिंग्लेटलेट्स का उपयोग करता हूं, जब मुझे एक निश्चित वर्ग ए की वस्तुओं को बनाने के लिए एक कारखाने की आवश्यकता होती है (आइए एक प्रकार की एफ कहिए) ए कुछ विन्यास मापदंडों का उपयोग करके कारखाने का निर्माण एक बार किया जाता है और फिर प्रत्येक बार एक वस्तु का उपयोग किया जाता है टाइप A को तत्काल किया जाता है। तो कोड का हर वह भाग जो ए को सिंगल करना चाहता है, सिंगलटन f को लाता है और उदाहरण के लिए नया उदाहरण बनाता है
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
तो मेरा परिदृश्य सामान्य है
- मुझे या तो ऑप्टिमाइज़ेशन कारणों के लिए एक वर्ग की केवल एक आवृत्ति की आवश्यकता है (मुझे कई फैक्ट्री ऑब्जेक्ट्स की आवश्यकता नहीं है) या सामान्य स्थिति साझा करने के लिए (जैसे कि फैक्ट्री जानता है कि ए के कितने उदाहरण अभी भी बना सकते हैं)
- मुझे कोड के विभिन्न स्थानों में एफ के इस उदाहरण तक पहुंच के लिए एक रास्ता चाहिए।
मुझे इस चर्चा में कोई दिलचस्पी नहीं है कि यह पैटर्न अच्छा है या बुरा है, लेकिन यह मानकर कि मैं एक सिंगलटन का उपयोग करने से बचना चाहता हूं, मैं अन्य कौन से पैटर्न का उपयोग कर सकता हूं?
कार्यक्रम के दौरान किसी बिंदु पर कारखाना बनाने के लिए रजिस्ट्री (या 2) से फैक्ट्री ऑब्जेक्ट प्राप्त करने के लिए मेरे पास जो विचार थे (1) थे और फिर एक पैरामीटर के रूप में फैक्ट्री को पास करें।
समाधान (1) में, रजिस्ट्री स्वयं एक सिंगलटन है, इसलिए मैंने कारखाने से रजिस्ट्री तक एक सिंगलटन का उपयोग नहीं करने की समस्या को स्थानांतरित कर दिया है।
मामले में (2) मुझे कुछ प्रारंभिक स्रोत (ऑब्जेक्ट) की आवश्यकता होती है जिसमें से फैक्ट्री ऑब्जेक्ट आता है इसलिए मुझे डर है कि मैं फिर से किसी अन्य सिंगलटन (मेरी फैक्ट्री उदाहरण प्रदान करने वाली वस्तु) पर वापस आ जाऊंगा। सिंगलेट्स की इस श्रृंखला का अनुसरण करके मैं शायद एक सिंगलटन (संपूर्ण अनुप्रयोग) की समस्या को कम कर सकता हूं, जिसके द्वारा अन्य सभी एकल सीधे या अप्रत्यक्ष रूप से प्रबंधित होते हैं।
क्या यह अंतिम विकल्प होगा (एक प्रारंभिक सिंगलटन का उपयोग करना जो अन्य सभी अनूठी वस्तुओं को बनाता है और सही स्थानों पर अन्य सभी सिंग्लेटों को इंजेक्ट करता है) एक स्वीकार्य समाधान है? क्या यह वह समाधान है, जो एकांत में सुझाया जाता है, जब कोई एकल का उपयोग नहीं करने की सलाह देता है, या अन्य समाधान क्या हैं, जैसे ऊपर वर्णित उदाहरण में?
संपादित करें
चूंकि मुझे लगता है कि मेरे प्रश्न का बिंदु कुछ लोगों द्वारा गलत समझा गया है, यहां कुछ और जानकारी है। जैसा कि यहां बताया गया है , सिंगलटन शब्द एक उदाहरण ऑब्जेक्ट के साथ (ए) एक वर्ग को इंगित कर सकता है और (बी) इस तरह के ऑब्जेक्ट को बनाने और उपयोग करने के लिए उपयोग किया जाने वाला डिज़ाइन पैटर्न।
चीजों को स्पष्ट करने के लिए (a) और (b) के लिए सिंगलटन पैटर्न के लिए अद्वितीय शब्द का उपयोग करें । तो, मुझे पता है कि सिंगलटन पैटर्न और निर्भरता इंजेक्शन क्या हैं (बीटीडब्लू, हाल ही में मैं कुछ कोड मैं काम कर रहा हूं) से सिंगलटन पैटर्न के उदाहरणों को हटाने के लिए डीआई का भारी उपयोग कर रहा हूं।
मेरा कहना यह है कि जब तक मुख्य विधि के ढेर पर रहने वाली किसी एक वस्तु से पूरी वस्तु ग्राफ को त्वरित नहीं किया जाता है, तब तक सिंगलटन पैटर्न के माध्यम से कुछ अद्वितीय वस्तुओं तक पहुंचने की आवश्यकता हमेशा रहेगी।
मेरा प्रश्न यह है कि क्या संपूर्ण ऑब्जेक्ट ग्राफ निर्माण और वायरिंग मुख्य विधि पर निर्भर करता है (उदाहरण के लिए कुछ शक्तिशाली डीआई फ्रेमवर्क के माध्यम से जो पैटर्न का उपयोग नहीं करता है) एकमात्र एकल-पैटर्न- मुक्त समाधान है।