आपकी पोस्ट से ठीक है, भले ही यह स्पष्ट रूप से नहीं बताया गया हो, ऐसा लगता है कि आप अमूर्त वर्ग को दो अलग-अलग भूमिकाएं खेलना चाहते हैं। भूमिकाएँ हैं:
- एक (सिंगलटन) सेवा कई substitutable कार्यान्वयन हो सकता है के लिए सार कारखाने भूमिका,
- सेवा इंटरफ़ेस भूमिका,
प्लस आप चाहते हैं कक्षाओं के पूरे परिवार में सिंगलटन को 'सिंगलोननेस' लागू करने की सेवा, किसी कारण से सेवा आवृत्ति को कैश करने के लिए पर्याप्त नहीं है।
यह ठीक है।
कोई कहता है कि यह बहुत बुरा लगता है क्योंकि "चिंताओं को अलग करने का उल्लंघन करता है" और "सिंगलेट और यूनिट परीक्षण अच्छी तरह से नहीं जाते हैं"।
कोई और कहता है कि यह ठीक है- क्योंकि आप परिवार में सही बच्चों को तुरंत चालू करने की ज़िम्मेदारी देते हैं और समग्र रूप से अधिक धाराप्रवाह इंटरफ़ेस का पर्दाफाश करते हैं क्योंकि आपको किसी कारखाने के मध्यस्थता की आवश्यकता नहीं होती है जो किसी को प्रकट करने से कुछ और नहीं करता है स्थैतिक विधि
क्या गलत है कि आप बच्चों को यह चुनने के लिए जिम्मेदार होना चाहते हैं कि पैरेंट फैक्ट्री विधि किस कार्यान्वयन को वापस लेनी चाहिए। यह डिज़ाइन के मामले में गलत है क्योंकि आप सभी बच्चों को सौंप रहे हैं जो कि अल्ट्रा सुपरक्लास में आसानी से धक्का दिया जा सकता है और केंद्रीकृत किया जा सकता है और यह भी दिखाता है कि आप विभिन्न संदर्भों में उपयोग किए जाने वाले पैटर्न को मिश्रित कर रहे हैं, सार फैक्ट्री (माता-पिता निर्णय लेते हैं कि किस परिवार का कक्षा के क्लाइंट प्राप्त करने जा रहे हैं) और फैक्टरी विधि (बच्चों कारखानों का चयन करें कि ग्राहकों को क्या मिलेगा)।
फ़ैक्टरी विधि की आवश्यकता नहीं है बल्कि फैक्ट्री विधियों के साथ भी संभव नहीं है क्योंकि यह "उदाहरण" विधियों को लागू करने या ओवरराइड करने पर केंद्रित है। एक स्थिर तरीके के लिए ओवरराइड जैसी कोई चीज नहीं है, न ही एक निर्माता के लिए।
तो एक अमूर्त सिंगलटन के प्रारंभिक अच्छे या बुरे विचार पर वापस जाने के लिए जो चुनता है कि किस व्यवहार का खुलासा करना शुरुआती समस्या को हल करने के कई तरीके हैं, कोई निम्न हो सकता है, बुरा लगता है लेकिन मुझे लगता है कि क्या है आप देख रहे थे:
public abstract class A{
public static A getInstance(){
if (...)
return B.getInstance();
return C.getInstance();
}
public abstract void doSomething();
public abstract void doSomethingElse();
}
public class B extends A{
private static B instance=new B();
private B(){
}
public static B getInstance(){
return instance;
}
public void doSomething(){
...
}
...
}
//do similarly for class C
माता-पिता भी प्रतिबिंब का उपयोग कर सकते हैं।
अधिक परीक्षण अनुकूल और विस्तार अनुकूल समाधान केवल उन बच्चों के लिए है जो सिंगलटन नहीं हैं बल्कि कुछ आंतरिक पैकेज में पैक किए गए हैं जिन्हें आप "निजी" और अमूर्त माता-पिता के रूप में दस्तावेज करेंगे जो "सिंगलटन नकल" स्थिर प्राप्त करने() और " बच्चों को उदाहरणों को कैश करेगा कि ग्राहकों को हमेशा एक ही सेवा उदाहरण मिलता है।
स्रोत
2010-10-15 20:25:03
सिंगलटन में निजी कन्स्ट्रक्टर का उद्देश्य किसी और को तत्काल इसे रोकने के लिए है। मैंने इसे यहां हासिल कर लिया है - आप एक अमूर्त वर्ग को तुरंत चालू नहीं कर सकते हैं, और सबक्लास के पास एक निजी कन्स्ट्रक्टर है। – Simon
यह सबक्लास को केवल अमूर्त होने के लिए मजबूर नहीं करता है और केवल एक निजी कन्स्ट्रक्टर है। – BalusC
सिंगलटन एक निजी कन्स्ट्रक्टर _require_ नहीं है (सार्वजनिक प्रश्नकर्ता के साथ इस प्रश्न के समाधान के लिए मेरा जवाब देखें)। – ryvantage