क्रमिक कन्स्ट्रक्टर पैटर्न
स्थिर फ़ैक्टरी और कन्स्ट्रक्टर, दोनों ही कई पैरामीटर होने पर उचित रूप से प्रतिक्रिया देने में असमर्थ होते हैं। उदाहरण के लिए, यदि किसी क्लास के 6 फ़ील्ड हैं और आप 2 पैरामीटर, 3 पैरामीटर, ... आदि के लिए अलग-अलग कन्स्ट्रक्टर बनाना चाहते हैं, तो आप नीचे दिए गए क्रमिक कन्स्ट्रक्टर पैटर्न का उपयोग कर सकते हैं।
लेकिन यह भी, यदि पैरामीटर बहुत अधिक हैं, तो कोड को पढ़ते समय प्रत्येक मान का अर्थ समझना मुश्किल हो जाता है और समान प्रकार के पैरामीटर को भ्रमित करके मान डालने की संभावना रहती है।
जावा बीन्स पैटर्न
जावा बीन्स पैटर्न में, आप बिना किसी पैरामीटर के कन्स्ट्रक्टर का उपयोग करके ऑब्जेक्ट बनाते हैं और फिर सेटर मेथड को कॉल करके वांछित पैरामीटर मान सेट करते हैं।
जावा बीन्स पैटर्न पैरामीटर की संख्या में वृद्धि होने पर भी, आपको मानों को भ्रमित किए बिना ऑब्जेक्ट बना सकता है। हालाँकि, एक ऑब्जेक्ट बनाने के लिए आपको कई सेटर मेथड को कॉल करना होगा और ऑब्जेक्ट पूरी तरह से बनने से पहले संगति खराब हो सकती है। इस कारण से, आप क्लास को अपरिवर्तनीय नहीं बना सकते हैं।
बिल्डर पैटर्न
क्रमिक कन्स्ट्रक्टर पैटर्न की स्थिरता और जावा बीन्स पैटर्न की पठनीयता को मिलाकर बिल्डर पैटर्न का उपयोग मुख्य रूप से किया जाता है।
क्लाइंट सीधे ऑब्जेक्ट बनाने के बजाय, केवल आवश्यक पैरामीटर के साथ कन्स्ट्रक्टर को कॉल करके बिल्डर ऑब्जेक्ट प्राप्त करता है। फिर, वह बिल्डर ऑब्जेक्ट द्वारा प्रदान किए गए एक प्रकार के सेटर मेथड का उपयोग करके वांछित वैकल्पिक पैरामीटर सेट करता है। अंत में, वह बिना किसी पैरामीटर के build() मेथड को कॉल करके आवश्यक ऑब्जेक्ट प्राप्त करता है।
Builder क्लास के अंदर कन्स्ट्रक्टर केवल आवश्यक पैरामीटर इनपुट लेता है और बाकी वैकल्पिक पैरामीटर एक प्रकार के सेटर मेथड के जरिए भरे जाते हैं। और अंत में, build() मेथड के जरिए NutritionFactsWithBuilderPattern ऑब्जेक्ट बनाया जाता है। NutritionFactsWithBuilderPattern क्लास अपरिवर्तनीय है और बिल्डर के सेटर मेथड खुद को वापस करते हैं, जिससे उन्हें लगातार कॉल किया जा सकता है। इस तरीके को फ्लुएंट एपीआई या मेथड चेनिंग कहते हैं।
क्लाइंट के नजरिए से, बिल्डर पैटर्न के जरिए कोड लिखना और पढ़ना आसान हो जाता है।
क्लास जो पदानुक्रमित ढंग से डिज़ाइन किए गए हैं, उनके साथ बिल्डर पैटर्न अच्छी तरह से काम करता है
Pizza.Builder क्लास एक पुनरावर्ती प्रकार सीमित जेनेरिक प्रकार है और self() नामक एक सार मेथड जोड़ा गया है ताकि सबक्लास को बिना किसी कास्टिंग के मेथड चेनिंग का समर्थन कर सके। सबक्लास में, इस सार मेथड का रिटर्न मान स्वयं होना चाहिए।
अब, न्यूयॉर्क पिज्जा और कैलज़ोन पिज्जा नामक Pizza के सबक्लास को देखते हुए बिल्डर पैटर्न की लचीलापन को देखें।
प्रत्येक सबक्लास के बिल्डर द्वारा परिभाषित build() मेथड एक विशिष्ट सबक्लास को वापस कर रहा है। सबक्लास के मेथड का सुपरक्लास के मेथड द्वारा वापस किए गए प्रकार के बजाय उसका सबटाइप वापस करने की क्षमता को सहसंयोजी रिटर्न टाइपिंग कहा जाता है। इस सुविधा का उपयोग करके, क्लाइंट को कास्टिंग करने की आवश्यकता नहीं होती है।
क्लाइंट के नजरिए से, Pizza के enum और प्रत्येक सबक्लास के enum का मिश्रण संभव है, और ऑब्जेक्ट को पूरा करने के लिए प्रत्येक के उचित मेथड का उपयोग किया जा सकता है।
बिल्डर पैटर्न के नुकसान
- बिल्डर ऑब्जेक्ट बनाना होगा।
- कोड लंबा हो जाता है।
सारांश
यदि कन्स्ट्रक्टर या स्टेटिक फ़ैक्टरी मेथड को कई पैरामीटर संभालने की आवश्यकता है, तो बिल्डर पैटर्न पर विचार करें।
स्रोत
- इफेक्टिव जावा
टिप्पणियाँ0