डिजाइन पैटर्न पर: मुझे सिंगलटन का उपयोग कब करना चाहिए?


448

गौरवशाली वैश्विक चर - गौरवशाली वैश्विक वर्ग बन जाता है। कुछ लोग ऑब्जेक्ट-ओरिएंटेड डिज़ाइन को तोड़ते हैं।

मुझे अच्छे पुराने लकड़हारे के अलावा अन्य परिदृश्य दें, जहां यह सिंगलटन का उपयोग करने के लिए समझ में आता है।


4
एरांग सीखने के बाद से, मैं उस दृष्टिकोण को पसंद करता हूं, अर्थात् अपरिवर्तनीयता और संदेश गुजरना।
सेतोरी

209
इस प्रश्न के बारे में रचनात्मक क्या नहीं है? मैं नीचे रचनात्मक उत्तर देख रहा हूं।
mk12

3
एक निर्भरता इंजेक्शन ढांचा एक बहुत ही जटिल सिंगलटन है जो वस्तु को बाहर निकालता है…।
इयान रिंगरोज

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

मेरा एक पक्ष प्रश्न है: किसी भी सिंगलटन कार्यान्वयन को एक "स्थिर" वर्ग ("कारखाना" / "इनिट" विधि के साथ) का उपयोग करके भी लागू किया जा सकता है - वास्तव में एक वर्ग का उदाहरण बनाए बिना (आप कह सकते हैं कि एक स्थिर वर्ग एक है एक प्रकार का सिंगलटन कार्यान्वयन, लेकिन ...) - एक स्थिर वर्ग के बजाय एक वास्तविक सिंगलटन (एक एकल श्रेणी का उदाहरण जो अपने एकल को सुनिश्चित करता है) का उपयोग क्यों करना चाहिए? एकमात्र कारण जो मैं सोच सकता हूं कि शायद "शब्दार्थ" के लिए है, लेकिन उस अर्थ में भी, सिंगलटन उपयोग के मामलों को वास्तव में परिभाषा द्वारा "वर्ग->" उदाहरण की आवश्यकता नहीं है ... इसलिए ... क्यों?
युवल ए।

जवाबों:


358

सत्य की मेरी खोज पर मुझे पता चला कि एक सिंगलटन का उपयोग करने के वास्तव में बहुत कम "स्वीकार्य" कारण हैं।

एक कारण जो इंटर्नट्स पर बार-बार आने के लिए होता है, वह है "लॉगिंग" क्लास (जिसका आपने उल्लेख किया है)। इस स्थिति में, एक एकल वर्ग के एक उदाहरण के बजाय एक सिंगलटन का उपयोग किया जा सकता है क्योंकि एक लॉगिंग क्लास को आमतौर पर एक परियोजना में प्रत्येक वर्ग द्वारा बार-बार विज्ञापन के साथ उपयोग करने की आवश्यकता होती है। यदि हर वर्ग इस लॉगिंग क्लास का उपयोग करता है, तो निर्भरता इंजेक्शन बोझिल हो जाता है।

लॉगिंग "स्वीकार्य" सिंगलटन का एक विशिष्ट उदाहरण है क्योंकि यह आपके कोड के निष्पादन को प्रभावित नहीं करता है। लॉगिंग अक्षम करें, कोड निष्पादन समान है। इसे सक्षम करें, वही। मिसको इसे सिंगनलों के रूट कॉज़ में निम्नलिखित तरीके से डालता है , "यहां की जानकारी एक तरह से प्रवाहित होती है: आपके एप्लिकेशन से लकड़हारे से। भले ही लॉगर वैश्विक स्थिति हो, क्योंकि लॉगर से कोई भी जानकारी आपके आवेदन में प्रवाहित नहीं होती है, लकड़हारा स्वीकार्य हैं।"

मुझे यकीन है कि अन्य वैध कारण भी हैं। एलेक्स मिलर, में " पैटर्न आई हेट " में, सेवा लोकेटरों और क्लाइंट साइड यूआई की भी संभवतः "स्वीकार्य" पसंद की बात हो रही है।

और अधिक पढ़ें सिंगलटन आई लव यू, लेकिन आप मुझे नीचे ला रहे हैं।


3
@ArneMertz मुझे लगता है कि यह एक है।
हमला

1
आप सिर्फ एक वैश्विक वस्तु का उपयोग क्यों नहीं कर सकते? इसे एकल क्यों होना पड़ता है?
जूता

1
मुझे लगता है कि एक लॉगिंग उपयोग के लिए स्थिर विधि?
स्काईनेट

1
जब आपको संसाधनों का प्रबंधन करने की आवश्यकता होती है, तो सिंगलेट्स सबसे अच्छे होते हैं। उदाहरण के लिए, Http कनेक्शन। आप एक भी क्लाइंट के लिए 1 मिलियन http क्लाइंट स्थापित नहीं करना चाहते, जो कि बेकार और धीमा है। तो एक कनेक्शन वाला एचटीटीपी क्लाइंट के साथ एक सिंगलटन बहुत तेज और संसाधन अनुकूल होगा।
कोगमैन

3
मुझे पता है कि यह एक पुराना सवाल है, और इस जवाब में जानकारी बहुत अच्छी है। हालाँकि, मुझे यह समझने में परेशानी हो रही है कि यह क्यों स्वीकार किया गया उत्तर है जब ओपी स्पष्ट रूप से निर्दिष्ट करता है: "मुझे अच्छे पुराने लकड़हारे के अलावा अन्य परिदृश्य दें, जहां यह सिंगलटन का उपयोग करने के लिए समझ में आता है।"
फ्रांसिस्को सी।

124

सिंगलटन उम्मीदवार को तीन आवश्यकताओं को पूरा करना चाहिए:

  • एक साझा संसाधन तक समवर्ती पहुंच को नियंत्रित करता है।
  • संसाधन तक पहुँच को सिस्टम के कई, अलग-अलग हिस्सों से अनुरोध किया जाएगा।
  • केवल एक ही वस्तु हो सकती है।

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

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

एक साधारण लकड़हारा संभवतः-वैध सिंगलटन का सबसे स्पष्ट उदाहरण है, लेकिन यह अधिक जटिल लॉगिंग योजनाओं के साथ बदल सकता है।


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

15
मुझे लगता है कि आप "उम्मीदवार" शब्द से चूक गए। एक सिंगलटन उम्मीदवार को तीन आवश्यकताओं को पूरा करना चाहिए; सिर्फ इसलिए कि कुछ आवश्यकताओं को पूरा करता है, इसका मतलब यह नहीं है कि यह एक सिंगलटन होना चाहिए। अन्य डिजाइन कारक हो सकते हैं :)
मेटा जूल

45

कॉन्फ़िगरेशन फ़ाइलों को पढ़ना जो केवल स्टार्टअप समय पर पढ़ा जाना चाहिए और उन्हें सिंगलटन में इनकैप्सुलेट करना चाहिए।


8
इसी के लिए Properties.Settings.Default.NET में।
निक बेडफोर्ड

9
@Paul, "नो-सिंगलटन कैंप" में कहा जाएगा कि कॉन्फ़िगरेशन ऑब्जेक्ट को केवल उन कार्यों में पारित किया जाना चाहिए जो इसे विश्व स्तर पर सुलभ (उर्फ सिंगलटन) बनाने के बजाय इसकी आवश्यकता है।
पचेरियर

2
सहमत नहीं हैं। क्या कॉन्फ़िगरेशन को डेटाबेस में ले जाया जाना चाहिए, सब कुछ खराब हो गया है। क्या कॉन्फ़िगरेशन का मार्ग उस सिंगलटन के बाहर किसी भी चीज पर निर्भर होना चाहिए, इन चीजों को भी स्थिर होना चाहिए।
rr-

3
@PaulCroarkin क्या आप इस पर विस्तार कर सकते हैं और बता सकते हैं कि यह कैसे फायदेमंद है?
एलेक्सगॉन

1
@ rr- यदि कॉन्फ़िगरेशन डेटाबेस में चला जाता है, तो इसे अभी भी एक कॉन्फ़िगरेशन ऑब्जेक्ट में इनकैप्सुलेट किया जा सकता है, जिसे उन फ़ंक्शन में पास किया जाएगा जिन्हें इसकी आवश्यकता है। (PS मैं "नो-सिंगलटन" शिविर में नहीं हूं)।
शेपर्ड

36

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

या एक डेटाबेस कनेक्शन या एक फ़ाइल प्रबंधक आदि।


30
मैंने इस प्रिंटर स्पूलर उदाहरण को सुना है और मुझे लगता है कि यह लंगड़ा है। कौन कहता है कि मेरे पास एक से अधिक स्पूलर नहीं हो सकते हैं? बिल्ली वैसे भी एक प्रिंटर स्पूलर क्या है? क्या होगा अगर मेरे पास विभिन्न प्रकार के प्रिंटर हैं जो अलग-अलग ड्राइवरों का संघर्ष या उपयोग नहीं कर सकते हैं?
1800

6
इसका सिर्फ एक उदाहरण है ... किसी भी स्थिति के लिए जिसे कोई भी एक उदाहरण के रूप में उपयोग करता है, आप एक वैकल्पिक डिजाइन खोजने में सक्षम होंगे जो उदाहरण को बेकार बनाता है। आइए दिखाते हैं कि स्पूलर एक एकल संसाधन का प्रबंधन करता है जिसे कई घटकों द्वारा साझा किया जाता है। यह काम करता हैं।
विंसेंट रामधनी

2
यह गैंग ऑफ़ फोर का क्लासिक उदाहरण है। मुझे लगता है कि एक असली कोशिश की गई मामले के साथ एक उत्तर अधिक उपयोगी होगा। मेरा मतलब है कि ऐसी स्थिति जहां आपको वास्तव में लगा कि सिंगलटन सबसे अच्छा समाधान है।
आंद्रेई वजना II

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

बिल्ली एक प्रिंटर स्पूलर क्या है?
रेवेल्वेस

23

कुछ वैश्विक राज्य (उपयोगकर्ता की भाषा, मदद फ़ाइलपथ, आवेदन पथ) को संग्रहीत करने वाले केवल एकल ही पढ़ें उचित हैं। व्यापार तर्क को नियंत्रित करने के लिए सिंगलटन का उपयोग करने में सावधानी बरतें - सिंगल लगभग हमेशा मल्टीपल होता है


4
उपयोगकर्ता भाषा केवल इस धारणा के साथ सिंगलटन हो सकती है कि केवल एक उपयोगकर्ता सिस्टम का उपयोग कर सकता है।
शमूएल undस्लंड

… और वह एक उपयोगकर्ता केवल एक भाषा बोलता है।
spectras

17

एक डेटाबेस के लिए एक कनेक्शन (या कनेक्शन का एक पूल) का प्रबंधन।

मैं इसका उपयोग बाहरी विन्यास फाइल पर informations को पुनः प्राप्त करने और संग्रहीत करने के लिए भी करूंगा।


2
डेटाबेस कनेक्शन जनरेटर एक कारखाने का एक उदाहरण नहीं होगा?
केन

3
@ आप चाहते हैं कि कारखाने लगभग सभी मामलों में एक सिंगलटन हो।
क्रिस मैरिसिक

2
@ फ़ेडरिको, "नो-सिंगलटन कैंप" में कहा गया है कि इन डेटाबेस कनेक्शन (ओं) को केवल उन कार्यों में पारित किया जाना चाहिए, जिनकी आवश्यकता उन्हें विश्व स्तर पर सुलभ (उर्फ सिंगलटन) बनाने के बजाय है।
1

3
आपको इसके लिए वास्तव में एक सिंगलटन की आवश्यकता नहीं है। इसे इंजेक्ट किया जा सकता है।
नेस्टर लेडन

11

आपके द्वारा सिंगलटन का उपयोग करने के तरीकों में से एक उदाहरण को कवर करना है जहां एक संसाधन तक पहुंच को नियंत्रित करने वाला एकल "ब्रोकर" होना चाहिए। सिंगलर्स लॉगर में अच्छे होते हैं क्योंकि वे ब्रोकर तक पहुंचते हैं, कहते हैं, एक फाइल, जो केवल विशेष रूप से लिखी जा सकती है। लॉगिंग जैसी किसी चीज़ के लिए, वे राइट्स को लॉग फ़ाइल की तरह कुछ को अलग करने का एक तरीका प्रदान करते हैं - आप अपने सिंग्लटन को एक कैशिंग तंत्र लपेट सकते हैं, आदि ...

ऐसी स्थिति के बारे में भी सोचें जहां आपके पास कई विंडोज़ / थ्रेड / आदि के साथ एक एप्लिकेशन है, लेकिन जिसे संचार के एक बिंदु की आवश्यकता है। मैंने एक बार नौकरियों को नियंत्रित करने के लिए एक का उपयोग किया था जिसे मैं लॉन्च करने के लिए अपना आवेदन चाहता था। सिंगलटन नौकरियों को क्रमबद्ध करने और कार्यक्रम के किसी अन्य भाग में अपनी स्थिति प्रदर्शित करने के लिए जिम्मेदार था, जो रुचि रखते थे। इस प्रकार के परिदृश्य में, आप अपने अनुप्रयोग के अंदर चल रहे "सर्वर" वर्ग की तरह किसी सिंगलटन को देख सकते हैं ... HTH


3
लॉगर सबसे अधिक बार सिंगललेट होते हैं ताकि लॉगिंग ऑब्जेक्ट को पास नहीं करना पड़े। एक लॉग स्ट्रीम का कोई भी सभ्य कार्यान्वयन यह सुनिश्चित करेगा कि समवर्ती लेखन असंभव है, चाहे वह एक सिंगलटन हो या नहीं।
मेटाओ

10

एक सिंगलटन का उपयोग एक संसाधन तक पहुंच का प्रबंधन करते समय किया जाना चाहिए जो पूरे एप्लिकेशन द्वारा साझा किया जाता है, और यह संभवतः एक ही वर्ग के कई उदाहरणों के लिए विनाशकारी होगा। यह सुनिश्चित करना कि साझा संसाधन थ्रेड तक पहुँच सुरक्षित है, इस तरह का पैटर्न महत्वपूर्ण हो सकता है।

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


8

मुझे लगता है कि सिंगलटन के उपयोग को डेटाबेस में कई-से-एक संबंधों के समान माना जा सकता है। यदि आपके पास अपने कोड के कई अलग-अलग हिस्से हैं, जो किसी ऑब्जेक्ट के एक ही उदाहरण के साथ काम करने की आवश्यकता है, तो यह वह जगह है जहां यह एकल का उपयोग करने के लिए समझ में आता है।


6

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

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

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

लगता है कि डेटा के समन्वय और व्यवहार के लचीलेपन के बीच एक धक्का और पुल है जो डेटा अखंडता को सुनिश्चित करने के लिए जितना संभव हो सके कम से कम व्यवहार के साथ एकल साझा डेटा के आसपास सिंगलटन डालकर कम किया जा सकता है।


5

जब आप कॉन्फ़िगरेशन गुण ऑब्जेक्ट लोड करते हैं, तो डेटाबेस या फ़ाइल से, यह एक सिंगलटन के रूप में होने में मदद करता है; स्थिर डेटा को फिर से पढ़ने का कोई कारण नहीं है जो सर्वर के चलने के दौरान नहीं बदलेगा।


2
आप केवल एक बार डेटा लोड क्यों नहीं करेंगे और आवश्यकतानुसार कॉन्फ़िगरेशन ऑब्जेक्ट को पास करेंगे?
lagweezle

आसपास से गुजरने के साथ क्या है ??? अगर मुझे हर उस चीज़ के आस-पास से गुज़रना पड़े जो मुझे चाहिए तो मुझे 20 तर्कों के साथ
निर्माणकर्ता चाहिए

@Enerccio अगर आपके पास ऐसी वस्तुएं हैं जो बिना किसी एनकैप्सुलेशन के 20 अलग-अलग लोगों पर निर्भर करती हैं, तो आपके पास पहले से ही प्रमुख डिजाइन मुद्दे हैं।
spectras

@spectras क्या मैं? अगर मैं गुई संवाद लागू करता हूं तो मुझे आवश्यकता होगी: रिपॉजिटरी, स्थानीयकरण, सत्र डेटा, एप्लिकेशन डेटा, विजेट पैरेंट, क्लाइंट डेटा, अनुमति प्रबंधक और शायद अधिक। ज़रूर, आप कुछ एकत्र कर सकते हैं, लेकिन क्यों? व्यक्तिगत रूप से मैं बसंत और पहलुओं का उपयोग करता हूं ताकि इन सभी आश्रितों को विजेट क्लास में शामिल किया जा सके और जो कि सब कुछ डिकॉय करता है।
फरवरी

यदि आपके पास इतना राज्य है, तो आप विशिष्ट संदर्भ के लिए प्रासंगिक पहलुओं पर विचार करते हुए, एक पहलू को लागू करने पर विचार कर सकते हैं। क्यों? क्योंकि यह सिंगलटन या 29-arg कंस्ट्रक्टर एंटीपैटर्न के बिना एक साफ डिजाइन की अनुमति देगा। वास्तव में आपका तथ्य यह है कि आपके संवाद सभी चीजों को "एकल जिम्मेदारी सिद्धांत का उल्लंघन" कहते हैं।
spectras

3

जैसा कि सभी ने कहा है, एक साझा संसाधन - विशेष रूप से ऐसा कुछ जो समवर्ती पहुंच को संभाल नहीं सकता है।

एक विशिष्ट उदाहरण जो मैंने देखा है, वह एक ल्यूसीन खोज सूचकांक लेखक है।


1
और फिर भी, IndexWriter एक सिंगलटन नहीं है ...
मार्क

3

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

आप एब्सट्रैक्ट फैक्ट्री को सिंगलटन भी बना सकते हैं।


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

1
@ kiwicomb123 setState()राज्य निर्माण नीति तय करने के लिए अपनी ज़िम्मेदारी बनाने की कोशिश करें । यदि आपकी प्रोग्रामिंग भाषा टेम्प्लेट या जेनरिक का समर्थन करती है तो यह मदद करता है। सिंगलटन के बजाय, आप मोनोस्टेट पैटर्न का उपयोग कर सकते हैं , जहां एक राज्य वस्तु को इंस्टेंट करना उसी वैश्विक / स्थिर राज्य वस्तु का पुन: उपयोग कर रहा है। राज्य को बदलने के लिए वाक्यविन्यास अपरिवर्तित रह सकता है, क्योंकि आपके उपयोगकर्ताओं को यह पता होने की आवश्यकता नहीं है कि तात्कालिक स्थिति एक मोनोस्टेट है।
एमिल कॉर्मियर

ठीक है, इसलिए मेरे राज्यों में मैं सभी तरीकों को स्थिर बना सकता था, इसलिए जब भी कोई नया उदाहरण बनाया जाता है तो उसमें एक ही ओवरहेड नहीं होता है? मैं थोड़ा भ्रमित हूं, मुझे मोनोस्टेट पैटर्न के बारे में पढ़ने की जरूरत है।
कीवीकोमबजाम २५'१123

@ kiwicomb123 नहीं, मोनोस्टेट सभी सदस्यों को स्थिर बनाने के बारे में नहीं है। बेहतर है कि आप इस पर पढ़ें, फिर संबंधित प्रश्नों और उत्तरों के लिए एसओ की जांच करें।
एमिल कॉर्मियर

मुझे लगता है कि यह अधिक वोट होना चाहिए। अमूर्त कारखाना काफी आम है और चूंकि कारखाने स्टेटलेस हैं, स्टेटलेस होने में स्थिर हैं, और स्थिर तरीकों (जावा में) के साथ लागू नहीं किया जा सकता है जो ओवरराइड नहीं हैं, सिंगलटन का उपयोग ठीक होना चाहिए।
DPM 13

3

साझा किए गए संसाधन। विशेष रूप से PHP में, एक डेटाबेस वर्ग, एक टेम्पलेट वर्ग, और एक वैश्विक चर डिपो वर्ग। सभी को सभी मॉड्यूल / वर्गों द्वारा साझा किया जाना है जो पूरे कोड में उपयोग किए जा रहे हैं।

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

एक वैश्विक चर डिपो सिंगलटन आपको एक वैश्विक, विश्वसनीय और आसानी से उपयोग करने योग्य चर डिपो प्रदान करता है। यह आपके कोड को बहुत बढ़िया बनाता है। किसी एकल में सरणी में सभी कॉन्फ़िगरेशन मान होने की कल्पना करें जैसे:

$gb->config['hostname']

या किसी सरणी में सभी भाषा मान जैसे:

$gb->lang['ENTER_USER']

पृष्ठ के लिए कोड चलाने के अंत में, आप कहते हैं, अब परिपक्व हो जाओ:

$template

सिंगलटन, एक $gbसिंगलटन जिसमें इसे बदलने के लिए लैंग एरे है, और सभी आउटपुट लोड और तैयार हैं। आप बस उन्हें उन कुंजियों में बदल देते हैं जो अब परिपक्व टेम्प्लेट ऑब्जेक्ट के पेज वैल्यू में मौजूद हैं, और फिर इसे उपयोगकर्ता को दिखाते हैं।

इसका महान लाभ यह है कि आप किसी भी चीज़ पर अपनी पसंद के बाद की प्रोसेसिंग कर सकते हैं। आप सभी भाषा मूल्यों को Google अनुवाद, या किसी अन्य अनुवाद सेवा में पाइप कर सकते हैं और उन्हें वापस ला सकते हैं, और उन्हें अपने स्थानों में बदल सकते हैं, उदाहरण के लिए, अनुवादित। या, आप चाहते हैं कि आप पृष्ठ संरचनाओं में बदल सकते हैं, या, सामग्री स्ट्रिंग,।


21
आप अपने उत्तर को कई पैराग्राफ में तोड़ सकते हैं और पठनीयता के लिए कोड सेगमेंट को रोक सकते हैं।
जस्टिन

1

यह विशिष्ट बुनियादी ढांचा चिंताओं को एकल या वैश्विक चर के रूप में कॉन्फ़िगर करने के लिए बहुत ही व्यावहारिक हो सकता है। इसका मेरा पसंदीदा उदाहरण डिपेंडेंसी इंजेक्शन चौखटे हैं जो फ्रेमवर्क से कनेक्शन बिंदु के रूप में कार्य करने के लिए एकल का उपयोग करते हैं।

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


0

प्लग-योग्य मॉड्यूल के साथ काम करते समय कमांड-लाइन मापदंडों को एनकैप्सुलेट करने वाले ऑब्जेक्ट के लिए मैं इसका उपयोग करता हूं। मुख्य कार्यक्रम को पता नहीं है कि कमांड-लाइन पैरामीटर उन मॉड्यूल के लिए क्या हैं जो लोड हो जाते हैं (और हमेशा यह भी नहीं जानते हैं कि मॉड्यूल क्या लोड किया जा रहा है)। उदाहरण के लिए, मुख्य भार A, जिसे स्वयं किसी भी पैरामीटर की आवश्यकता नहीं है (इसलिए इसे अतिरिक्त पॉइंटर / संदर्भ / जो भी हो, मुझे यकीन नहीं है - प्रदूषण की तरह दिखता है), फिर मॉड्यूल X, Y और Z दो लोड करता है। इनमें से, X और Z, ज़रूरत (या स्वीकार) मापदंडों का कहना है, इसलिए वे कमांड-लाइन सिंगलटन को यह बताने के लिए वापस बुलाते हैं कि कौन से पैरामीटर को स्वीकार करना है, और रनटाइम में वे यह पता लगाने के लिए वापस कॉल करते हैं कि क्या उपयोगकर्ता ने वास्तव में कोई निर्दिष्ट किया है उनमें से।

कई मायनों में, सीजीआई मापदंडों को संभालने के लिए एक सिंगलटन इसी तरह काम करेगा यदि आप प्रति क्वेरी केवल एक प्रक्रिया का उपयोग कर रहे हैं (अन्य mod_ * विधियां ऐसा नहीं करती हैं, इसलिए यह वहां बुरा होगा - इस प्रकार तर्क जो आपको कहना चाहिए ' यदि आप mod_perl या जो भी दुनिया में पोर्ट करते हैं, तो mod_cgi दुनिया में सिंगललेट्स का उपयोग करें।


-1

कोड के साथ एक उदाहरण, शायद।

यहाँ, कंकरीट नैन्सी एक पोकर गेम में एक सिंगलटन है जो पैकेज ट्री तक सभी तरह से व्यवहार को अनुमति देता है, खेल के कुछ प्रमुख इंटरफेस (यानी, मॉडल, दृश्य, नियंत्रक, पर्यावरण, आदि के लिए facades)।

http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html

ईडी।


1
लिंक अब टूट गया है, लेकिन यदि आप एक सिंगलटन में दृश्य जानकारी दर्ज कर रहे हैं, जिसे पूरे एप्लिकेशन तक पहुँचा जाएगा, तो आपको एमवीसी की बात याद आ रही है। एक नियंत्रक द्वारा एक दृश्य को अपडेट किया जाता है (और संचार करता है), जो मॉडल का उपयोग करता है। जैसा कि यह यहाँ लगता है, यह शायद सिंगलटन का दुरुपयोग है और एक refactoring क्रम में है।
drharris

-9

1 - पहले उत्तर पर एक टिप्पणी:

मैं एक स्थिर लकड़हारा वर्ग से सहमत नहीं हूँ। यह एक कार्यान्वयन के लिए व्यावहारिक हो सकता है, लेकिन यह इकाई परीक्षण के लिए बदली नहीं जा सकता है। एक स्थिर वर्ग को परीक्षण डबल द्वारा प्रतिस्थापित नहीं किया जा सकता है। यदि आप इकाई परीक्षण नहीं करते हैं, तो आप यहाँ समस्या नहीं देखेंगे।

2 - मैं हाथ से एक सिंगलटन नहीं बनाने की कोशिश करता हूं। मैं बस एक सरल वस्तु का निर्माण करता हूं जिसमें निर्माता हैं जो मुझे ऑब्जेक्ट में सहयोगियों को इंजेक्ट करने की अनुमति देते हैं। अगर मुझे एक सिंगलटन की आवश्यकता है, तो मैं एक निर्भरता फ्रेमवर्क (स्प्रिंग.नेट, यूनिटी फॉर .NET, जावा के लिए स्प्रिंग), या कुछ अन्य का उपयोग करूंगा।


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

आप इकाई परीक्षण लॉगिंग क्यों चाहते हैं?
एनरिको 13

"एक स्थिर लकड़हारा वर्ग" और एक स्थिर लकड़हारा उदाहरण के बीच एक बड़ा अंतर है । सिंगलटन पैटर्न यह नहीं कहता है कि "अपनी कक्षा को स्थिर बनाएं", यह वस्तु स्थैतिक के उदाहरण तक पहुंच बनाने के लिए कहता है। इसलिए, उदाहरण के लिए, ILogger logger = Logger.SingleInstance();जहां यह विधि स्थिर है और यह एक ILogger के एक स्टेटिक रूप से संग्रहीत उदाहरण देता है। आपने "एक निर्भरता इंजेक्शन ढांचे" के उदाहरण का उपयोग किया। लगभग सभी DI कंटेनर सिंगलटन हैं; उनके कॉन्फ़िगरेशन को सांख्यिकीय रूप से परिभाषित किया गया है और अंततः एकल सेवा प्रदाता इंटरफ़ेस में / से संग्रहीत किया गया है।
जॉन डेविस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.