2010-03-18 18 views
14

मैं सोच रहा था, स्थिर Create विधियां क्यों मौजूद हैं?स्थैतिक तरीके विधियां क्यों मौजूद हैं?

उदाहरण के लिए, क्यों इस कोड का उपयोग: इस कोड पर

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri); 

:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri); 

मैं एक दूसरे के ऊपर का उपयोग कर के लिए तर्क नहीं मिल रहा है, और किसी भी संबंध नहीं मिल सकता है कक्षाओं के बीच जो इस निर्माण का उपयोग दूसरे पर करते हैं।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

उत्तर

17

XmlReader एक सार श्रेणी है। आप इसे तुरंत चालू नहीं कर सकते हैं।

Create विधि प्रदान करना कारखाना पैटर्न का एक उदाहरण है। निर्दिष्ट तर्कों के आधार पर XmlReader का एक अलग कार्यान्वयन चुना जाता है और लौटाया जाता है। उदाहरण के लिए, .NET ढांचे में XmlReader कार्यान्वयन को मान्य और गैर-मान्य कर रहे हैं।

+0

इस तथ्य को कभी भी नहीं देखा कि यह सार है। क्या इस वर्ग में हर वर्ग के लिए यह सच है? – GeReV

+1

+1 लेकिन आप थोड़ा उदाहरण देने के लिए कुछ और लाइनें खर्च कर सकते थे .. –

+0

@GeReV: .NET Framework में कई सार वर्ग हैं जो एक बनाएं विधि प्रदान करते हैं। लेकिन यह एक आवश्यकता नहीं है। यह एक डिजाइन पैटर्न है। – dtb

5

क्योंकि यह वास्तव में व्युत्पन्न प्रकार का निर्माण और उद्देश्य कर सकता है जिसके पास आपके पास कोई सार वर्ग नहीं है (डीटीबी उत्तर के रूप में)। यह factory method pattern है।

+0

ठीक है, अगर आप वास्तव में विकिपीडिया लेख पढ़ते हैं जिसे आपने चिपकाया है तो आप देखेंगे कि यह एक पूरी तरह से अलग पैटर्न का वर्णन करता है। – Grzenio

+0

यह वही पैटर्न है। विधि को पारित पैरामीटर के आधार पर यह विभिन्न प्रकार की वस्तुओं को बनाता है। –

+1

फिर से पढ़ें। आपके द्वारा लिंक किया गया पैटर्न एक सार, सामान्य कार्यान्वयन के लिए पारित तर्कों पर नहीं, एक अमूर्त बनाएँ विधि के वास्तविक कार्यान्वयन के आधार पर नए उदाहरण बनाता है। हालांकि यह बहुत समान है। – dtb

3

यह पैटर्न आपको कक्षा की अनुमति देता है ताकि आप Create पर गए पैरामीटर के अनुरूप व्युत्पन्न कक्षाओं के उदाहरण प्रदान कर सकें। विशेष रूप से ओवरलोड जो XmlReaderSettings ऑब्जेक्ट को स्वीकार करते हैं। आपकी सेटिंग्स के आधार पर एक अलग XmlReader सबक्लास आपको वापस कर दिया जा सकता है।

एक बेहतर उदाहरण WebRequest.Create(url) है। यूआरएल आप पारित आधार पर, आप एक HttpWebRequest, एक FtpWebRequest, आदि

3
  • क्योंकि आप वस्तु की सही वर्ग आप प्राप्त करने के लिए प्रतिबद्ध करने के लिए की जरूरत नहीं है प्राप्त हो सकता है। रचनाकार केवल एक वर्ग से वस्तुओं का निर्माण कर सकते हैं।
  • क्योंकि आप विधि को सार्थक नाम दे सकते हैं, उदा। BigInt.probablePrime()। रचनाकारों के पास केवल कक्षा के समान नाम हो सकता है।
  • क्योंकि आपके पास समान पैरामीटर प्रकार संयोजन के लिए एक से अधिक फैक्ट्री विधि हो सकती हैं, उदा। प्वाइंट.fromPolarCoords (int, int) और Point.fromCartesianCoords (int, int), लेकिन केवल एक कन्स्ट्रक्टर प्वाइंट (int, int) हो सकता है।

(एक अधिक विस्तृत जवाब बलोच की। 'प्रभावी जावा' में दी गई है)

1

कभी कभी वे स्वयं दस्तावेज के एक फार्म के रूप में मौजूद हैं। मेरे पास एक डीबी एक्सेस घटक है जो मैं कनेक्शन स्ट्रिंग या कॉन्फ़िगरेशन फ़ाइल में कनेक्शन का नाम तत्काल कर सकता हूं। इन दोनों विधियों में एक पैरामीटर के रूप में तार लगते हैं ताकि उन्हें अकेले तर्कों से अलग नहीं किया जा सके। इसलिए मैंने FromConnectionString(string) फैक्टरी विधि और FromConnectionName(string) फैक्टरी विधि बनाई। यह बारीकियों को पूरी तरह से new Foo(bool, string) लाइन से खो दिया जाएगा।

6

एक अधिक सामान्य जवाब ...

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

एक और कारण यह है कि एक फैक्ट्री विधि को वास्तव में नई वस्तुओं को बनाने की आवश्यकता नहीं होती है - यदि आवश्यकता हो तो यह वही एक से अधिक हो सकता है।

4

एक कन्स्ट्रक्टर का उपयोग केवल एक विशिष्ट वर्ग के उदाहरण बनाने के लिए किया जा सकता है, जबकि एक स्थिर Create विधि इनपुट के आधार पर विभिन्न वर्गों का एक उदाहरण बना सकती है।

XmlReader वर्ग Create विधि के मामले एक XmlDictionaryReader, XmlTextReader, XmlValidatingReader या XmlNodeReader वापस आ जाएगी, जो के आधार पर में आप का उपयोग ओवरलोड और क्या मानकों आप इसे करने के लिए भेजें।

0

विचार यह है कि इस तरह वे XmlReader के कार्यान्वयन को बदल सकते हैं और किसी भी उपयोगकर्ता कोड को तोड़ नहीं सकते हैं (उदाहरण के लिए वे विधि प्रकार से वापस आने वाले वास्तविक प्रकार को बदल सकते हैं)।

मुझे व्यक्तिगत रूप से इस दृष्टिकोण को पसंद नहीं है, क्योंकि यह XmlReader क्लास पदानुक्रम में एक व्यस्त संबंध बनाता है। शायद उन्होंने सोचा कि कारखाना पैटर्न एक overkill है?

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