"StringBuilder" बिल्डर डिजाइन पैटर्न का एक आवेदन है?


31

"बिल्डर" पैटर्न "टेलीस्कोपिंग कंस्ट्रक्टर" को विरोधी पैटर्न को संबोधित करने के लिए प्रतिबंधित है, या यह भी कहा जा सकता है कि अपरिवर्तनीय वस्तुओं के जटिल निर्माण की अधिक सामान्य समस्या को संबोधित करें?

StringBuilderवर्ग शब्द "निर्माता" अपने नाम में है, लेकिन यह कंस्ट्रक्टर्स telescoping के साथ कोई संबंध नहीं है, यह केवल मदद करता है हम सभी डेटा है कि हम एक अपरिवर्तनीय वस्तु के निर्माता को पास किए जाने एकत्रित करते हैं।

मेरे लिए ऐसा प्रतीत होता है कि उत्तर बहुत स्पष्ट "हाँ" है, लेकिन इस विषय पर कुछ असहमति प्रतीत होती है, इसलिए मैं उम्मीद कर रहा था कि कोई इसे स्पष्ट कर सकता है।

मैं इस सवाल का जवाब दे रहा था: प्रोग्रामर एसई: एक निर्माणकर्ता में वैध "असली काम"? जहाँ ओपी एक जटिल वृक्ष से युक्त एक (संभवत: अपरिवर्तनीय) वस्तु बनाना चाहता है, और "बिल्डर" पैटर्न का विचार पॉप अप करता है, और इस पर शोध करते समय मुझे यह प्रश्नोत्तर मिला, जो यह कहता है कि "स्ट्रिंगब्यूबर्ल" का निर्माण की शैली है "बिल्डर" पैटर्न का एक आवेदन नहीं , उन कारणों के लिए जो मेरे लिए स्पष्ट नहीं हैं: स्टैकओवरफ़्लो - स्ट्रिंगबर्लियर और बिल्डर पैटर्न । (जो लोग उस प्रश्न का उत्तर दे रहे हैं, वह एक ठोस बिंदु बनाने में विफल रहा, जहाँ तक मैं बता सकता हूँ।)


2
मुझे लगता है कि स्टैक ओवरफ्लो सवाल पर पॉल ससिक का जवाब पूरी तरह से आश्वस्त करता है: स्ट्रीटब्युल्ट एक "वर्कअराउंड" है जो प्रदर्शन योग्य समस्या के लिए अपरिवर्तनीय स्ट्रिंग्स को समाप्‍त करता है। सबसे अच्छे रूप में, स्ट्रिंगबुर्टल "दुर्भाग्य से नाम" है। आप यह तर्क दे सकते हैं कि स्ट्रिंगब्यूलर वेब पृष्ठों का "निर्माण" कर सकता है, मुझे लगता है, लेकिन यह एक सामान्य तंत्र का एक विशिष्ट अनुप्रयोग है
रॉबर्ट हार्वे

3
पॉल ससिक का उत्तर जावा के लिए गलत है - मैंने अंतर्निहित स्रोत कोड को देखा। StringBuilderस्ट्रिंग का प्रतिनिधित्व करने के लिए एक अंतर्निहित चरित्र सरणी का उपयोग करता है और आपको किसी भी बिंदु पर सम्मिलन और निष्कासन जैसी चीजें करने की अनुमति देता है। अंत में, मुझे लगता है कि StringBuilder अपरिवर्तनीय स्ट्रिंग वस्तुओं के लिए एक समाधान है, लेकिन यह अन्यथा मुझे ऐसा लगता है जैसे यह बिल्डर पैटर्न के इरादे को पूरा करता है।
थॉमस ओवेन्स

4
मुझे इसके बारे में और अधिक सोचने की आवश्यकता है - यह मुझे परेशान करता है। मैंने लगभग लिखना शुरू कर दिया कि क्यों StringBuilder कुछ बिल्डर पैटर्न का एक संस्करण है और बाकी सभी गलत थे। लेकिन मुझे कुछ कमजोरियां मिलीं, खुद को यकीन दिलाया कि मैं गलत था, लेकिन फिर अपने पहले विचार पर वापस जाने का प्रबंध किया। यदि आप बिल्डर पैटर्न के इरादे को देखते हैं, तो यह देखना आसान है कि "स्ट्रिंगबर्स्ट एक बिल्डर है"। यदि आप बिल्डर पैटर्न की संरचना को देखते हैं, तो यह कठिन है।
थॉमस ओवेन्स

1
इसके लायक क्या है, स्टैक ओवरफ्लो पर यह जवाब मेरे शुरुआती विचार से सहमत है कि स्ट्रिंगबुलस्ट एक बिल्डर कार्यान्वयन है और टिप्पणियां दिलचस्प हैं। तो आप तर्क के दोनों पक्षों को पा सकते हैं। मैं इस सवाल का पक्ष ले रहा हूं - मुझे नहीं पता कि क्या मैं एक अच्छा जवाब बना सकता हूं, लेकिन यह सुनिश्चित करने के लिए एक दिलचस्प सवाल है। मैं इस बारे में सोच रहा हूँ।
थॉमस ओवेन्स

2
सभी GoF पैटर्न समय की कसौटी पर खड़े नहीं होते हैं। मैं 'नहीं कह रहा हूँ, मैं सिर्फ कह रहा हूँ'।
बेन

जवाबों:


36

A StringBuilderबिल्डर पैटर्न के समान है, लेकिन इस डिज़ाइन पैटर्न के GoF विवरण के साथ अधिक साझा नहीं करता है। डिजाइन पैटर्न का मूल बिंदु था

एक जटिल वस्तु के निर्माण को उसके प्रतिनिधित्व से अलग करें ताकि एक ही निर्माण प्रक्रिया अलग-अलग प्रतिनिधित्व बना सके।

- गामा, हेल्म, जॉनसन, Vlissides द्वारा डिजाइन पैटर्न से ।

(ध्यान दें: "जटिल" का अर्थ मुख्य रूप से "कई भागों से बना" होता है, जरूरी नहीं कि "जटिल" या "कठिन" हो।

"विभिन्न अभ्यावेदन" यहाँ प्रमुख है। जैसे इस निर्माण प्रक्रिया को मानते हुए:

interface ArticleBuilder {
  void addTitle(String title);
  void addParagraph(String paragraph);
}

void createArticle(ArticeBuilder articleBuilder) {
  articleBuilder.addTitle("Is String Builder an application of ...");
  articleBuilder.addParagraph("Is the Builder Pattern restricted...");
  articleBuilder.addParagraph("The StringBuilder class ...");
}

हम एक HtmlDocumentया एक के साथ समाप्त हो सकते हैं TexDocumentया MarkdownDocumentक्या ठोस कार्यान्वयन प्रदान किया जाता है पर निर्भर करता है:

class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

तो बिल्डर पैटर्न का एक केंद्रीय बिंदु बहुरूपता है । डिज़ाइन पैटर्न बुक इस पैटर्न की तुलना एब्सट्रैक्ट फ़ैक्टरी से करती है:

एब्सट्रैक्ट फैक्ट्री बिल्डर के समान है कि यह भी जटिल वस्तुओं का निर्माण कर सकता है। प्राथमिक अंतर यह है कि बिल्डर पैटर्न कदम से एक जटिल वस्तु कदम के निर्माण पर केंद्रित है। […] बिल्डर उत्पाद को अंतिम चरण के रूप में लौटाता है, लेकिन जहां तक ​​सार फैक्टरी का संबंध है, उत्पाद तुरंत वापस आ जाता है।

- गामा, हेल्म, जॉनसन, Vlissides द्वारा डिजाइन पैटर्न से ।

यह चरण-दर-चरण पहलू तब बिल्डर पैटर्न का अधिक लोकप्रिय पहलू बन गया है, ताकि आम बोलचाल में बिल्डर पैटर्न को इस तरह समझा जाए:

किसी ऑब्जेक्ट को कई चरणों में विभाजित करना। इससे हम उन तर्कों या वैकल्पिक मापदंडों का उपयोग कर सकते हैं जो इन भाषाओं में भी इन सुविधाओं का समर्थन नहीं करते हैं।

विकिपीडिया इस तरह से पैटर्न को परिभाषित करता है:

बिल्डर पैटर्न ऑब्जेक्ट निर्माण सॉफ्टवेयर डिज़ाइन पैटर्न है। अमूर्त कारखाने पैटर्न और कारखाने विधि पैटर्न के विपरीत जिसका उद्देश्य बहुरूपता को सक्षम करना है, बिल्डर पैटर्न का इरादा दूरबीन निर्माण विरोधी पैटर्न [उद्धरण वांछित] का समाधान खोजना है । [...]

बिल्डर पैटर्न का एक और फायदा है। इसका उपयोग उन वस्तुओं के लिए किया जा सकता है जिनमें समतल डेटा (html कोड, SQL क्वेरी, X.509 प्रमाणपत्र ...) होता है, ऐसा कहना है, डेटा जिसे आसानी से संपादित नहीं किया जा सकता है। इस प्रकार के डेटा को चरण दर चरण संपादित नहीं किया जा सकता है और इसे एक ही बार में संपादित किया जाना चाहिए। इस तरह के ऑब्जेक्ट के निर्माण का सबसे अच्छा तरीका बिल्डर क्लास का उपयोग करना है। [प्रशस्ति पत्र की जरूरत]

- विकिपीडिया पर बिल्डर पैटर्न से , विभिन्न योगदानकर्ताओं द्वारा।

इसलिए जैसा कि हम देख सकते हैं, इस नाम का वास्तव में कोई आम समझ नहीं है कि यह किस पैटर्न को संदर्भित करता है, और कुछ बिंदुओं में विभिन्न परिभाषाएँ एक दूसरे के विपरीत भी हैं (जैसे कि बिल्डर्स के लिए बहुरूपता की प्रासंगिकता के बारे में)।

StringBuilderपैटर्न की विभिन्न व्याख्याओं के साथ एकमात्र सामान्य संपत्ति यह है कि उत्पाद को एक बार में जाने के बजाय चरण दर चरण बनाया जाता है। यह डिज़ाइन पैटर्न के GoF परिभाषा की एक सख्त रीडिंग को पूरा नहीं करता है, लेकिन कृपया ध्यान दें कि डिज़ाइन पैटर्न संचार को सुविधाजनक बनाने के लिए निंदनीय अवधारणाएं हैं। मैं StringBuilderबिल्डर पैटर्न का एक उदाहरण जारी रखना चाहूंगा , यद्यपि यह एक असामान्य है - जावा में उस संरचना का मुख्य कारण अपरिवर्तनीय तारों की उपस्थिति में प्रदर्शन समवर्ती है, लेकिन कुछ दिलचस्प ऑब्जेक्ट-ओरिएंटेड डिज़ाइन नहीं है।


7
यह मुझे लगता है कि अपरिवर्तनीय वस्तुओं का निर्माण बिल्डर्स के अधिक सामान्य उपयोगों में से एक लगता है - मुझे लगता है कि इसने प्राथमिक उपयोग को GoF द्वारा वर्णित के रूप में बदल दिया है, इसलिए सहमत हैं कि यह निश्चित रूप से पैटर्न के उदाहरण के रूप में सबसे अच्छा वर्णित है।
जूल्स

यूनिटेबल इंटीग्रेशन टेस्टिंग के दौरान फेक डेटा / ऑब्जेक्टमैटर्स के बड़े ग्राफ्स बनाने के लिए बिल्डर डीएसएल के लिए एक और usecase वास्तव में उपयोगी है।
स्टुअर्टएलसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.