2009-08-25 15 views
6

एक सिंगलटन बनाम सेवा लोकेटर का उपयोग करने के फायदे और नुकसान क्या हैं? मैंने पढ़ा है कि सिंगलेट्स खराब हैं लेकिन मुझे आश्चर्य है कि क्या सेवा लोकेटर आमतौर पर चीजों को करने का एक बेहतर तरीका होगा।सिंगलटन बनाम सेवा लोकेटर

उत्तर

9

दोनों दृष्टिकोण खराब हैं कि यह वर्ग अनुबंध से स्पष्ट नहीं है कि इसकी 'निर्भरताएं क्या हैं। यही है,

private void foo() 
{ 
    var x = SomeSingleton.Instance.GetX(); 
    var y = ServiceLocator.GetService<IProvider>().GetY(); 
} 

SomeSingleton के लिए संदर्भ है और IProvider गहरी कहीं अंदर दफन कर दिया।

हालांकि, शुद्ध सिंगलटन दृष्टिकोण की तुलना में, सेवा लोकेटर आम तौर पर ज्यादा है कि वे सरल केंद्रीकृत विन्यास, जीवन प्रबंधन, आदि उन्होंने यह भी बेहतर testability के लिए अनुमति देने के लिए अनुमति देने के में बेहतर कर रहे हैं (आप कर सकते हैं GetService<T> को हमेशा नकली कॉल), कम युग्मन , चिंताओं को अलग करना, आदि

+2

मैं अब तक विरोधी पैटर्न पर विचार करने के लिए जाऊंगा, लेकिन मैं मानता हूं कि सेवा लोकेटर मामूली रूप से बेहतर है। सबसे अच्छा समाधान उचित निर्भरता इंजेक्शन को लागू करना होगा। –

+0

जो मैं डी से समझता हूं, क्या उसे उन सभी ऑब्जेक्ट्स की आवश्यकता नहीं होती है जो सिंगलटन को सीधे पूर्व-सिंगलटन ऑब्जेक्ट का संदर्भ रखने के लिए उपयोग करते हैं? – djcouchycouch

+0

हां, आपको उन्हें कन्स्ट्रक्टर के पैरामीटर के रूप में देना होगा (यदि आप कन्स्ट्रक्टर इंजेक्शन का उपयोग करते हैं, तो इसे आमतौर पर "आपकी निर्भरता घोषित करें" के रूप में जाना जाता है)। चीजों को थोड़ा सा आसान बनाने के लिए, आप नियंत्रण कंटेनर के उलटा उपयोग कर सकते हैं। Google Guice पर एक नज़र डालें। –

0

यदि परीक्षण योग्यता चिंता का विषय है, तो सेवा लोकेटर का उपयोग करके शुद्ध सिंगलेट बेहतर होता है।

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