2009-09-30 12 views

उत्तर

22

प्रत्येक वर्ग एक इंटरफेस को कार्यान्वित कर सकता है, और सिंगलटन सिर्फ एक "सामान्य" वर्ग है जो सुनिश्चित करता है कि किसी भी समय यह केवल एक उदाहरण मौजूद है, अन्य व्यावसायिक तर्क के अलावा यह लागू हो सकता है। इसका यह भी अर्थ है कि सिंगलटन में कम से कम 2 जिम्मेदारियां हैं और यह ओओ डिजाइन अच्छा नहीं है क्योंकि कक्षाओं में केवल 1 जिम्मेदारी होनी चाहिए और यह सुनिश्चित करना चाहिए कि वे उस जिम्मेदारी पर अच्छे हैं, लेकिन यह एक और चर्चा है।

+0

क्यों सिंगलटन अच्छा ओओ डिज़ाइन नहीं है? वास्तव में सबसे आम ओओ डिजाइन पैटर्न में से एक है –

+2

@ क्रिस्टियन विल्मा: (हां, देर से) मुद्दा यह है कि यह * ग्लोबल वैरिएबल * की तरह * ग्लोबल स्टेट * बनाता है, और इसी तरह के मुद्दों से पीड़ित है। उदाहरण के लिए, कक्षाओं का परीक्षण करना मुश्किल है जो बाहरी ज्ञान के बिना आंतरिक रूप से सिंगलेट का अनुरोध करते हैं। आपका उत्पादन डीबी कचरा/परीक्षण डेटा से भरा है? सिंगलेट के लिए जाँच करें। एक बग शिकार करना? यदि आपके पास सिंगलेट हैं, और इसलिए वैश्विक स्थिति है, तो आप केवल सीमित दायरे पर ध्यान केंद्रित नहीं कर सकते हैं; आपको कोड-बेस को ध्यान में रखना होगा। एक सिंगलटन धन्यवाद। ध्यान दें कि यह सिंगलटन * पैटर्न * के बारे में है, न कि सिंगलटन * ऑब्जेक्ट्स *। सामान्य उपयोग का मतलब यह नहीं है कि यह "अच्छा" होना चाहिए। – ray

0

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

10

कुछ की तरह:

public interface MyInterface 
{ 
} 

और

public class MySingleton implements MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+2

आपको इसे एक सिंगलटन बनाने के लिए उस कक्षा में एक निजी नो-Args कन्स्ट्रक्टर जोड़ने की आवश्यकता है। –

+7

एफवाईआई, सिंगलटन को लागू करने के लिए जावा में सबसे अच्छा तरीका एक एकल तत्व enum का उपयोग कर है।यह सार्वजनिक क्षेत्र के दृष्टिकोण से अधिक संक्षिप्त है और यह धारावाहिक तंत्र को मुफ्त में प्रदान करता है और यह प्रतिबिंब हमलों के खिलाफ सुरक्षा भी प्रदान करता है। इस विधि को अभी तक व्यापक रूप से अपनाया जाना बाकी है लेकिन यह जानना दिलचस्प हो सकता है। अधिक जानकारी के लिए जोशुआ ब्लोच द्वारा "प्रभावी जावा" में इसके बारे में आइटम देखें। – nkr1pt

+0

@ एंड्रयू: धन्यवाद, मैं एसओ और दिन की नौकरी के बीच उछाल रहा था और दुर्घटना से चूक गया :-) –

0

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

एक इंटरफ़ेस के उपयोग के साथ, यह किसी अन्य वर्ग के इंटरफेस को लागू करने के तरीके के समान होगा।

और यह उस वस्तु के क्लोनिंग की अनुमति नहीं देनी चाहिए।

5

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

एक विकल्प एक फैक्ट्री क्लास रखना है जो उस स्थिर विधि को रखता है। तो वहाँ धारण करने के लिए स्थिर विधि दूसरा इंटरफ़ेस तिहाई है तीन वर्गों प्रथम श्रेणी हो जाएगा ठोस वर्ग

है लेकिन हम ठोस निर्माता निजी नहीं कर सकते।

लेकिन अगर आपके बुनियादी ढांचे दो संकुल जनता के लिए एक और निजी

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

मुझे उम्मीद है कि यह आपकी मदद कर सकता है।

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