2010-07-23 13 views
15

हमें सिंगलटन पैटर्न का उपयोग कब करना चाहिए और क्यों?सिंगलटन पैटर्न

+3

यह सिर्फ मुझे है, लेकिन आपको हमेशा इसे टालने का प्रयास करना चाहिए। कोई फर्क नहीं पड़ता भाषा। – zneak

+0

आपको एक उत्तर मिल सकता है [यहां] (http://zuta-developer.blogspot.com/2012/06/singleton-pattern.html)। वहां आप वास्तविक दुनिया के उदाहरण और सिंगलटन पैटर्न की पूर्ण व्याख्या देखेंगे। – ZuTa

+0

यहां कुछ संबंधित प्रश्न हैं: [1]: http: // stackoverflow।कॉम/प्रश्न/137975/क्या-खराब-बारे में-सिंगलटन [2]: http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern – dzhu

उत्तर

1

सिद्धांत में: जब आपको किसी ऑब्जेक्ट के इंस्टेंटेशन को एक उदाहरण में प्रतिबंधित करने की आवश्यकता होती है। अभ्यास में: कभी नहीं।

3

यदि आपके पास ऐसी स्थिति है जब सिस्टम में कार्रवाइयों को समन्वयित करने के लिए बिल्कुल एक ऑब्जेक्ट की आवश्यकता होती है, तो आप इस पैटर्न का उपयोग कर सकते हैं। इसका एक अच्छा उदाहरण फेकाडे है, यानी, फेकाडे को सिंगलेट्स के रूप में कार्यान्वित किया जा सकता है क्योंकि अक्सर सिस्टम में एक फेकाडे ऑब्जेक्ट की आवश्यकता होती है।

लेकिन आम तौर पर, यह आमतौर पर एक खराब प्रथा है और इससे बचा जाना चाहिए, एक बड़ा कारण यह है कि यह विस्तारशीलता को बहुत रोकता है।

17

http://sites.google.com/site/steveyegge2/singleton-considered-stupid

क्यों सिंगलटन इतना आकर्षक है? मैं स्वीकार करने वाला पहला व्यक्ति हूं: मुझे यह भी पसंद आया। नहीं, खरोंच - मैं सिंगलटन प्यार करता था। यह उस समय से एक पुराने दोस्त की तरह लगा जब मैंने आँखें रखीं। यह सरल और सुंदर था।

मैं आपको बताउंगा क्यों: ऐसा इसलिए है क्योंकि सिंगलटन पैटर्न गैर-ओओ प्रोग्रामिंग में फेंक रहा है। यह उन लोगों के लिए जीवन रेखा है जो एक शब्द को नहीं समझते थे कि चार गिरोह कहने की कोशिश कर रहे थे। मुझे नहीं पता कि यह पहली जगह में कैसे पहुंचा - कुछ राजनीतिक ओओपीएसएल दबाव, इसमें कोई संदेह नहीं है - लेकिन यह वहां से संबंधित नहीं है। यह यहाँ बुराई है ...

"लघु" सारांश है ...

क) मैं मुद्दों की भी एक दसवें शामिल नहीं किया है। लेकिन मैं उनमें से कुछ का नाम दूंगा।

बी) एक मेमोरी प्रबंधन है; एक सिंगलटन मूल रूप से सिर्फ एक स्मृति रिसाव है, अगर कोई भी थोड़ी देर के लिए इसका उपयोग नहीं करेगा। लेकिन आपको पता नहीं है कि इसे कब हटाना है, क्योंकि कोई भी आपको फोन करने जा रहा है और कहता है "कोई भी थोड़ी देर के लिए आप का उपयोग नहीं करेगा!"

इसके अलावा, आप यह नहीं बता सकते कि आपके सिंगलटन इंस्टेंस के संदर्भ में किसने संदर्भ रखा है, क्योंकि आप इसे सौंपने के बारे में बहुत खुश थे, है ना? (नोट: जावा के कमजोर संदर्भ इस मुद्दे के साथ मदद कर सकते हैं)।

सी) मेमोरी लीक की बात करते हुए, क्या होगा यदि आपके सिंगलटन के पास कुछ सीमित संसाधनों जैसे डेटाबेस या फ़ाइल हैंडल के लिए हैंडल है? मुझे लगता है कि जब तक आपका प्रोग्राम समाप्त नहीं हो जाता तब तक आप उस चूसने वाले को खोलने के लिए मिलता है। भगवान सी ++ प्रोग्राम क्रैश होने से लगभग 10 मिनट पहले कभी नहीं, आमतौर पर संसाधनों से बाहर होने से, या सिंगलटन तक पहुंचने की कोशिश करने से पहले कभी भी नहीं टिकते हैं।

डी) एक और मुद्दा यह है कि सिंगलटन डिजाइन वाक्य रचनात्मक रूप से शोर है; ज्यादातर भाषाएं इसका समर्थन नहीं करती हैं (ठीक है, रुबी करता है, दुख की बात है, लेकिन संभवतः मैटज़ को कोई बेहतर पता था), इसलिए आपको सिंगलटन में न केवल बॉयलरप्लेट कोड में रहना होगा, बल्कि हर किसी में इसका उपयोग करना होगा।

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

एफ) स्थैतिक विधियां ग्रेनाइट के रूप में लचीली हैं। हर बार जब आप एक का उपयोग करते हैं, तो आप कंक्रीट में अपने कार्यक्रम का हिस्सा कास्टिंग कर रहे हैं। बस सुनिश्चित करें कि आपके पैर में वहां जाम नहीं है क्योंकि आप इसे देख रहे हैं। किसी दिन आप आश्चर्यचकित होंगे कि, भगवान द्वारा, आपको वास्तव में उस डांग प्रिंटस्प्लर वर्ग के एक और कार्यान्वयन की आवश्यकता है, और यह एक इंटरफ़ेस, एक कारखाना, और कार्यान्वयन कक्षाओं का एक सेट होना चाहिए था। डी 'ओह!

ऐसा नहीं लगता है कि यह सब कुछ है। कई अन्य समस्याएं हैं। उदाहरण के लिए, मल्टीथ्रेडिंग जोड़ने का प्रयास करें और देखें कि क्या होता है। खैर, मैं आपको बताउंगा कि क्या होता है: आधा समय, आपको डबलटन या ट्रिपलटन मिलता है, जब तक कि आप एक सिंक्रनाइज़ेशन विशेषज्ञ नहीं होते हैं, और ट्रिपलटन होने के कारण आपकी चाय पार्टी में तीन बालोग दिखाई देते हैं। और यहां तक ​​कि यदि आप एक सिंक्रनाइज़ेशन विशेषज्ञ हैं और डबल-चेक मुहावरे को सही तरीके से प्राप्त करते हैं, तो भी आपको एक बल्रोग से निपटने के लिए मिला है, और वे कोई पिकनिक नहीं हैं।

लेकिन इन समस्याओं को सभी बड़े एक है, जो है कि सिंगलटन "पैटर्न" सब कुछ आप OO डिजाइन के बारे में पता है, के बाद से OO कठिन है भूलना करने के लिए प्रोत्साहित की तुलना में निरर्थकता में फीका, और प्रक्रियात्मक आसान है ...

+0

ग्रेट लिंक, धन्यवाद! – KooiInc

+0

यह उल्लसित है कि यह मेरे सबसे ज्यादा वोट किए गए उत्तरों में से एक है :) –

0

जब आप एक ही ऑब्जेक्ट को संदर्भित करने में सक्षम होने के लिए विभिन्न ऑब्जेक्ट्स का एक गुच्छा चाहते हैं। हो सकता है कि वे सभी एक ही भौतिकीइंजिनड्यूड या कुछ का उपयोग करना चाहते हैं ... आप एक ही दुनिया में रहते समय विभिन्न भौतिकी मॉडल वाले विभिन्न ऑब्जेक्ट्स नहीं चाहते हैं!

+0

आप "..." जोड़ना भूल गए हैं और आप उन वस्तुओं के संदर्भ को पारित करने के लिए बहुत आलसी हैं जिनकी आवश्यकता है। " –

0

जब आपको कक्षा से केवल एक उदाहरण की आवश्यकता होती है। सबसे अच्छा उदाहरण लॉगर है। आपको बस इसका एक उदाहरण चाहिए।

0

जब सिस्टम में आवश्यक कक्षा से केवल एक उदाहरण होता है। चूंकि इसमें केवल एक उदाहरण है, इसलिए आप दृढ़ता से निर्णय ले सकते हैं कि उपयोगकर्ता इसका उपयोग कैसे कर सकते हैं।

0

जैसा कि कहा गया है कि सिंगलटन पैटर्न का इरादा यह सुनिश्चित करना है कि कक्षा का एक उदाहरण तत्काल हो।

सिंगलटन पैटर्न को GOF pattern catalog में "खराब" पैटर्न में से एक माना जाता है क्योंकि सिंगलटन कोड में युग्मन करने की ओर जाता है और कोड को हार्ड (हार्ड) परीक्षण करता है। उत्तरार्द्ध बिंदु (अधिकतर) गतिशील/ढीली टाइप की गई भाषाओं में 100% सत्य नहीं है क्योंकि आप बंदर पैच कोड कर सकते हैं।

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

मैं केवल "सरल" सॉफ़्टवेयर के लिए सिंगलटन पैटर्न की अनुशंसा करता हूं लेकिन जैसा कि हम सभी जानते हैं कि सॉफ़्टवेयर में बढ़ने की प्रवृत्ति है। कुछ सालों के बाद सरल और अंत जटिल शुरू करने के लिए।

1

जब आप एक ही प्रकार के कई उदाहरण नहीं बनाना चाहते हैं तो आपको सिंगलटन के लिए जाना होगा। लेकिन यदि आप स्टेटिक क्लासेस का उपयोग करते हैं तो वही हासिल किया जा सकता है। तो यहां बिंदु यह है कि यह एकमात्र उदाहरण नहीं है बल्कि उदाहरण के निर्माण पर नियंत्रण है, इस प्रकार बहुमूल्य संसाधनों की अपर्याप्त खपत से परहेज करता है।

1

सब कुछ के बारे में सोचें जहां एक से अधिक उदाहरण एक त्रुटि (असंगतता) होगी। यह एक एप्लीकेशन ऑब्जेक्ट (ऐप के लिए रूट ऑब्जेक्ट) या एक एप्लीकेशन वाइड सिक्योरिटी मैनेजर इत्यादि हो सकता है। सिंगलटन केवल यह लागू करने का एक तरीका है कि कक्षा में केवल एक उदाहरण हो सकता है।

0
  • सॉफ्टवेयर इंजीनियरिंग में, सिंगलटन पैटर्न एक डिजाइन
    पैटर्न है कि एक वस्तु के लिए एक वर्ग के आरंभ होने की अनुमति नहीं देता है।
    यह तब उपयोगी होता है जब सिस्टम में
    क्रियाओं को समन्वयित करने के लिए बिल्कुल एक ऑब्जेक्ट की आवश्यकता होती है।

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

यहाँ अधिक ...

http://www.dzone.com/links/r/java_ee_singleton_design_pattern_introduction.html

0

सिंगलटन पैटर्न इस्तेमाल किया जाना चाहिए जब आप एक वर्ग अपने ऐप्लिकेशन में बनाए गए उसमें केवल एक ही लागू करना चाहते हैं। यह हो सकता है क्योंकि:

  • ऐसी वस्तु बनाने संसाधन गहन

  • वस्तु एक आवेदन स्तर वस्तु है, इसलिए उनमें से कई उदाहरणों को समझ में नहीं आता है।

इस प्रकार, सिंगलटन के रूप में ऐसी कक्षा को डिजाइन करना समझ में आता है। अधिक जानकारी के लिए, singleton design pattern explained with c# .net example

1

देखें सिंगलटन पैटर्न यह सुनिश्चित करने के लिए है कि कक्षा में केवल एक उदाहरण है, और इसके लिए वैश्विक बिंदु प्रदान करें।

4

जावा Runnableसिंगलटन पैटर्न का सबसे अच्छा उदाहरण है। जब आप एक प्रतिबंध जोड़ना चाहते हैं जो आपको किसी विशेष श्रेणी के एकल उदाहरण से अधिक बनाने की अनुमति नहीं देता है तो सिंगलटन पैटर्न को लागू करना बेहतर होता है। प्रमुख बिंदु सिंगलटन लागू करने के लिए:

  • निजी निर्माता
  • स्टेटिक निजी उदाहरण सिंगलटन वर्ग के ही चर
  • लोक गेटर विधि केवल बहुत पहले समय में यह चर ऊपर प्रारंभ हो जाएगा, और हमेशा सिंगलटन कक्षा के एक ही उदाहरण लौटते हैं।

    class Singleton { 
    
         private static Singleton instance; 
    
         private Singleton(){ 
         } 
    
         public static Singleton getInstance(){ 
         if(instance=null){ 
          instance=new Singleton(); 
         } 
    
         return instance; 
         } 
         ........ 
        } 
    

    और धागा सुरक्षा के लिए: getInstance() सिंक्रनाइज़ किया जाना चाहिए।

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