2012-02-06 10 views
12

मैं कैसे सिंगलटन वर्गों का उपयोग के बारे में पढ़ का एक बहुत कर रहा हूँ छिपा निर्भरता की वजह से प्रोग्रामिंग में बुरा व्यवहार होता जा रहा है, कठिन परीक्षण करने के लिए आदि आदिको खत्म करना Singletons

मैंने पढ़ लिया है मंच पदों का एक बहुत कहा है कि आप अभी भी सिंगलटन पैटर्न का उपयोग किए बिना एक उदाहरण की इजाजत देने की सिंगलटन की मुख्य कार्यक्षमता को बनाए रख सकते हैं।

मुझे आश्चर्य हुआ कि अगर कोई इसका व्यावहारिक उदाहरण दे सकता है। सिंगलटन उदाहरण बनाने के लिए कई पदों ने कारखाने वर्ग का उपयोग करने का सुझाव दिया है जहां निर्भरता स्पष्ट रूप से दिखायी जाती है। मेरे लिए यह ऐसा लगता है कि कई सिंगलेट्स लेते हैं और उन्हें एक फैक्ट्री सिंगलटन में जोड़ते हैं, जिसमें एक ही समस्या होगी?

+6

सिंगलेट्स स्वयं आंतरिक रूप से बुरा नहीं हैं। उन लोगों का उपयोग करना जहां आपको नहीं करना चाहिए, विशेष रूप से यदि आप अपना ऑब्जेक्ट लाइफसाइक्ल प्रबंधन कर रहे हैं (डीआई कंटेनर का उपयोग करने के विपरीत)। जब तक आपको फैक्ट्री फैक्ट्री की आवश्यकता न हो, तब तक * एक कारखाना एक सिंगलटन क्यों नहीं होना चाहिए? (यह अधिक तर्कसंगत है, वास्तविक कारण हैं, लेकिन वे अक्सर कोई फर्क नहीं पड़ता।) –

+0

आप जानते हैं, जब मैं अपने ऐप चक्र को प्रबंधित करने के लिए स्प्रिंग फ्रेमवर्क का उपयोग करता हूं, तो यह सभी बीन्स बनाता है जो सिंगलेट हैं, और केवल एक ही है एप्लीकेशनकॉन्टेक्स्ट के साथ-साथ (स्प्रिंग का मुख्य कार्यक्रम)।तो सिंगलेट्स खराब नहीं हैं, आपको केवल उन मुद्दों का ख्याल रखना होगा जिन पर आपने उल्लेख किया है (निर्भरता, टेस्टेबिलिटी, इत्यादि) – Luciano

+0

इस प्रश्न को गेम खेलने वाले प्रश्न की तरह फ्रेम करना फायदेमंद हो सकता है: "बुरे उपयोग के लिए खराब संभावित परिदृश्य हैं अकेले कॉल करने और पूरी तरह से स्थिर वर्ग/आदि बनाने के बदतर संभावित परिदृश्यों से सिंगलटन बेहतर है? इसका एकमात्र कारण यह है कि इसका उपयोग किया जा सकता है क्योंकि किसी भी पैटर्न का उपयोग किया जा सकता है, जिसका शायद दुरुपयोग किया जा सकता है - इसलिए यह पूछने के लिए समय है कि "कौन से संभावित संभावित परिणामों को सीमित करते हैं" – Dave

उत्तर

2

"सिंगलटन पैटर्न" के साथ समस्या वास्तव में सिंगलटन के साथ नहीं है, लेकिन सिंगलटन वर्ग में अनावश्यक स्थैतिक फैक्ट्री विधि के साथ समस्या है। और मेरा मानना ​​है कि यहां तक ​​कि गोफ बुक में, इसे उदाहरण माना जाता था कि एक सिंगलटन कैसे पहुंचा जा सकता है, निश्चित कार्यान्वयन मॉडल नहीं।

सिंगलटन उदाहरण बनाने के लिए कई पदों ने कारखाने वर्ग का उपयोग करने का सुझाव दिया है जहां निर्भरता स्पष्ट रूप से दिखायी जाती है। मेरे लिए ऐसा लगता है कि यह एकाधिक सिंगलेट्स लेने और को एक एकल फैक्ट्री सिंगलटन में जोड़ने जैसा लगता है, जिसमें एक ही समस्या होगी?

अंतर यह है कि यह एकल कारखाना तब एकल बिंदु बन जाता है जहां आप निर्भरता बनाए रखते हैं।

और वास्तव में, आम तौर पर स्वीकार समाधान Spring या Guice की तरह एक निर्भरता इंजेक्शन ढांचे जो मूल रूप से एक बहुत शक्तिशाली और लचीला विन्यास व्यवस्था है जिसके ज्यादा से ज्यादा सिर्फ एकमात्र प्रबंधन कर सकते हैं के साथ इस तरह एक भी कारखाना है उपयोग करने के लिए है।

1

आमतौर पर निर्भरता इंजेक्शन का उपयोग करने के लिए समाधान होता है। इसका मतलब यह नहीं है कि आपके पास ढांचा होना है, आपको केवल उदाहरण बनाने और अपने मुख्य कोड बेस पर उन्हें एक साथ कनेक्ट करने की आवश्यकता है। मैं एक मॉड्यूल का उपयोग करता हूं जो अन्य सभी घटकों पर निर्भर करता है और अन्य घटकों को बाहरी रूप से (अन्य मॉड्यूल में मौजूद घटकों के लिए)

निर्भरता इंजेक्शन का उपयोग करके, जब भी आप केवल एक उदाहरण बनाते हैं तो आपके पास सिंगलटन होता है।

स्पष्ट रूप से, परीक्षणों में, आप उप-वर्गों और इंटरफेस के मैक्स समेत कई उदाहरण बना सकते हैं।

0

एक अच्छा व्यावहारिक उदाहरण वसंत फ्रेमवर्क है। यह डिफ़ॉल्ट रूप से "सिंगलटन" (कंटेनर में केवल एक उदाहरण) के रूप में बीन्स बनाता है, लेकिन प्रोग्रामर पैटर्न (निजी कन्स्ट्रक्टर, getInstance स्थिर विधि इत्यादि) को लागू करने की कोई आवश्यकता नहीं है।

संबंधित मुद्दे