दिलचस्प पोस्ट
TypeError: के लिए असमर्थित ऑपरेंड प्रकार (ओं):: 'str' और 'int' कैसे स्ट्रिंग फाइल में बैश खोल के साथ मौजूद है? यूनिक्स सॉर्ट के साथ कई चाबियाँ छंटनी आईफोन पर पहली बार ऐप लॉन्च कैसे लगाई जा सकती है एसक्यूएल फ़ाइल को MySQL में आयात करें टी-एसक्यूएल एक्सओआर ऑपरेटर मैं जावा के लिए सीन बिल्डर का नवीनतम संस्करण कहां डाउनलोड कर सकता हूं? क्या है यदि __name__ == "__main__": क्या करें? जावा अप्राप्य कैच ब्लॉक कंपाइलर त्रुटि निर्धारित हैडर के लिए समायोजित करने के लिए एक HTML एंकर को ऑफसेट करना PHP कोड निष्पादित नहीं किया जा रहा है, बजाय पृष्ठ पर कोड दिखाता है निमंत्रण या BeginInvoke को एक नियंत्रण पर नहीं बुलाया जा सकता जब तक विंडो हैंडल नहीं बनाया गया हो एंड्रॉइड में ओरिएंटेशन परिवर्तन पर asynctask के साथ गतिविधि पुनः लोड करने से बचें एंड्रॉइड गैलरी से एकाधिक चित्र चुनें मैं BitArray को एकल int में कैसे रूपांतरित कर सकता / सकती हूं?

आप बिल्डर पैटर्न का उपयोग कब करेंगे?

बिल्डर पैटर्न का उपयोग करने के कुछ सामान्य , वास्तविक दुनिया उदाहरण क्या हैं? यह आपको क्या खरीदता है? क्यों न सिर्फ एक फैक्ट्री पैटर्न का उपयोग करें?

वेब के समाधान से एकत्रित समाधान "आप बिल्डर पैटर्न का उपयोग कब करेंगे?"

एक बिल्डर और कारखाना आईएमएचओ के बीच मुख्य अंतर यह है कि एक बिल्डर उपयोगी होता है, जब आपको वस्तु बनाने के लिए कई चीजें करने की आवश्यकता होती है उदाहरण के लिए एक डोम की कल्पना करें आपको अपनी अंतिम वस्तु प्राप्त करने के लिए बहुत सारे नोड्स और विशेषताओं को बनाना होगा। एक फैक्ट्री का उपयोग तब किया जाता है जब फैक्ट्री आसानी से एक ऑब्जेक्ट कॉल में संपूर्ण ऑब्जेक्ट बना सकती है।

एक बिल्डर का उपयोग करने का एक उदाहरण एक XML दस्तावेज़ का निर्माण होता है, उदाहरण के लिए, मैं एक मॉडल का निर्माण करने के लिए एक विशेष प्रकार की तालिका बनाने के लिए एक बिल्डर बना सकता हूं और इसमें निम्नलिखित विधियां (पैरामीटर नहीं दिखाए जा सकते हैं) :

BuildOrderHeaderRow() BuildLineItemSubHeaderRow() BuildOrderRow() BuildLineItemSubRow() 

यह बिल्डर मेरे लिए एचटीएमएल को थूक देगा यह एक बड़ी प्रक्रियात्मक पद्धति के माध्यम से चलने को पढ़ने के लिए बहुत आसान है।

विकिपीडिया पर बिल्डर पैटर्न देखें

जावा में पैटर्न और उदाहरण कोड के उपयोग के लिए बहस के कुछ कारण हैं, लेकिन यह डिज़ाइन पैटर्न में चार गिरोह द्वारा कवर बिल्डर पैटर्न का कार्यान्वयन है। इसके कारण आप जावा में इसका इस्तेमाल करेंगे अन्य प्रोग्रामिंग भाषाओं के लिए भी लागू होते हैं।

यहोशू ब्लॉच प्रभावी जावा में बताते हैं , 2 संस्करण :

बिल्डर पैटर्न एक अच्छा विकल्प है, जब कक्षाएं डिजाइन करते हैं जिनके निर्माणकर्ता या स्थिर कारखानों में कुछ मापदंडों की तुलना में अधिक होता।

हम सबको कुछ बिंदु पर एक श्रेणी का सामना करना पड़ा जिसमें कंसल्टर्स की सूची होती है जहां प्रत्येक अतिरिक्त एक नया विकल्प पैरामीटर जोड़ता है:

 Pizza(int size) { ... } Pizza(int size, boolean cheese) { ... } Pizza(int size, boolean cheese, boolean pepperoni) { ... } Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... } 

इसे टेलीस्कोपिंग कन्स्ट्रक्टर पैटर्न कहा जाता है। इस पैटर्न के साथ समस्या यह है कि एक बार कन्स्ट्रक्टर 4 या 5 पैरामीटर लंबे होते हैं तो पैरामीटर के आवश्यक क्रम को याद रखना मुश्किल होता है और साथ ही आपको किसी विशेष परिस्थिति में किसी विशेष कन्स्ट्रक्टर को क्या चाहिए।

टेलीस्कोपिंग कन्स्ट्रक्टर पैटर्न के लिए आपके पास एक विकल्प जावाबीन पैटर्न है, जहां आप अनिवार्य पैरामीटर के साथ एक कन्स्ट्रक्टर को कॉल करते हैं और उसके बाद किसी भी वैकल्पिक सेटर्स को कॉल करते हैं:

 Pizza pizza = new Pizza(12); pizza.setCheese(true); pizza.setPepperoni(true); pizza.setBacon(true); 

यहां समस्या यह है कि क्योंकि ऑब्जेक्ट कई कॉलों से बना है, यह उसके निर्माण के जरिए एक असंगत राज्य में हो सकता है। इसके लिए थ्रेड सुरक्षा सुनिश्चित करने के लिए बहुत अधिक अतिरिक्त प्रयास की आवश्यकता होती है।

बेहतर विकल्प बिल्डर पैटर्न का उपयोग करना है

 public class Pizza { private int size; private boolean cheese; private boolean pepperoni; private boolean bacon; public static class Builder { //required private final int size; //optional private boolean cheese = false; private boolean pepperoni = false; private boolean bacon = false; public Builder(int size) { this.size = size; } public Builder cheese(boolean value) { cheese = value; return this; } public Builder pepperoni(boolean value) { pepperoni = value; return this; } public Builder bacon(boolean value) { bacon = value; return this; } public Pizza build() { return new Pizza(this); } } private Pizza(Builder builder) { size = builder.size; cheese = builder.cheese; pepperoni = builder.pepperoni; bacon = builder.bacon; } } 

ध्यान दें कि पिज्जा अपरिवर्तनीय है और यह पैरामीटर मान एक ही स्थान में हैं । चूंकि बिल्डर के सेटर विधियों बिल्डर ऑब्जेक्ट वापस आते हैं इसलिए वे जंजीर बनने में सक्षम हैं।

 Pizza pizza = new Pizza.Builder(12) .cheese(true) .pepperoni(true) .bacon(true) .build(); 

यह कोड में परिणाम है जो लिखना आसान है और पढ़ने और समझने में बहुत आसान है। इस उदाहरण में, बिल्ड विधि को बिल्डर से कॉपी किए जाने के बाद पैरामीटर को जांचने के लिए संशोधित किया जा सकता है और एक अमान्य पैरामीटर मान प्रदान किया गया है, तो अवैध फीस अपवाद फेंकता है। यह पैटर्न लचीला है और भविष्य में इसके लिए और पैरामीटर जोड़ना आसान है। यह वास्तव में केवल उपयोगी है यदि आपके पास कंस्ट्रक्टर के लिए 4 से 5 पैरामीटर अधिक हैं उस ने कहा, अगर आपको संदेह है कि आप भविष्य में और अधिक पैरामीटर जोड़ सकते हैं , तो यह पहली जगह में सार्थक हो सकता है

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

एक रेस्तरां पर विचार करें "आज के भोजन" का निर्माण एक फैक्ट्री पैटर्न है, क्योंकि आप रसोई से "आज का भोजन प्राप्त करें" बताते हैं और रसोई (फैक्ट्री) यह निर्धारित करती है कि छिपी मानदंडों के आधार पर क्या वस्तु उत्पन्न होती है।

यदि आप कस्टम पिज्जा का आदेश देते हैं तो बिल्डर दिखाई देता है इस मामले में, वेटर शेफ (बिल्डर) को बताता है, "मुझे पिज्जा की ज़रूरत है, इसमें पनीर, प्याज और बेकन जोड़ें!" इस प्रकार, बिल्डर उत्पन्न होने वाले ऑब्जेक्ट के गुणों को उजागर करता है, लेकिन उन्हें कैसे सेट करना छुपाता है

.NET StringBuilder वर्ग बिल्डर पैटर्न का एक बढ़िया उदाहरण है यह ज्यादातर चरणों की एक श्रृंखला में एक स्ट्रिंग बनाने के लिए उपयोग किया जाता है अंतिम परिणाम है जो आप ToString () कर रहे हैं हमेशा एक स्ट्रिंग है, लेकिन उस स्ट्रिंग का निर्माण स्ट्रिंगबिल्डर क्लास के कार्यों के अनुसार उपयोग किया गया था। संक्षेप करने के लिए, मूल विचार जटिल ऑब्जेक्ट बनाने और इसे कैसे बनाया जा रहा है इसके कार्यान्वयन विवरण छुपाएं।

बहु-थ्रेडेड समस्या के लिए, हमें प्रत्येक थ्रेड के लिए एक जटिल ऑब्जेक्ट की आवश्यकता होती थी। ऑब्जेक्ट संसाधित होने वाले डेटा का प्रतिनिधित्व करता है, और उपयोगकर्ता इनपुट के आधार पर बदल सकता है।

क्या हम इसके बजाय एक कारखाने का उपयोग कर सकते हैं? हाँ

हम क्यों नहीं? बिल्डर मुझे अधिक अनुमान लगाता है

इकाइयां विभिन्न प्रकार के ऑब्जेक्ट बनाने के लिए उपयोग की जाती हैं जो समान मूलभूत प्रकार हैं (समान इंटरफ़ेस या बेस क्लास लागू करें)।

बिल्डर्स एक ही प्रकार के ऑब्जेक्ट को और अधिक बनाते हैं, लेकिन निर्माण गतिशील है, इसलिए इसे रनटाइम पर बदला जा सकता है।

आप इसका इस्तेमाल करते हैं, जब आपके पास बहुत से विकल्प हैं Jmock जैसी चीज़ों के बारे में सोचें:

 m.expects(once()) .method("testMethod") .with(eq(1), eq(2)) .returns("someResponse"); 

यह बहुत अधिक प्राकृतिक लगता है और … संभव है

वहाँ भी xml इमारत, स्ट्रिंग इमारत और कई अन्य चीजें हैं। कल्पना कीजिए अगर java.util.Map ने बिल्डर के रूप में रखा था आप इस तरह सामान कर सकते हैं:

 Map<String, Integer> m = new HashMap<String, Integer>() .put("a", 1) .put("b", 2) .put("c", 3); 

माइक्रोसॉफ्ट एमवीसी ढांचे के माध्यम से जाने के दौरान, मुझे बिल्डर पैटर्न के बारे में एक विचार मिला मैं नियंत्रक बिल्डर वर्ग में पैटर्न के पास आया था यह वर्ग नियंत्रक कारखाने वर्ग को वापस करना है, जिसका उपयोग कंक्रीट नियंत्रक बनाने के लिए किया जाता है।

मैं बिल्डर पैटर्न का उपयोग करने में देख रहा हूँ यह लाभ यह है कि, आप अपने खुद का एक कारखाना बना सकते हैं और इसे फ्रेमवर्क में प्लग कर सकते हैं।

@ तेथा, इटालियन लड़के द्वारा संचालित एक रेस्तरां (फ़्रेमवर्क) हो सकता है, जो पिज्जा की सेवा करता है पिज्जा तैयार करने के लिए इटालियन लड़का (ऑब्जेक्ट बिल्डर) ओवेन (फ़ैक्टरी) का उपयोग पिज़्ज़ा बेस (बेस क्लास) के साथ करता है।

अब भारतीय व्यक्ति इटालियन लड़के से रेस्तरां पर ले जाता है पिज्जा के बजाय भारतीय रेस्तरां (फ़्रेमवर्क) सर्वर डोसा डोसा को तैयार करने के लिए भारतीय आदमी (ऑब्जेक्ट बिल्डर) मैदा (बेस क्लास) के साथ फ़्रीइंग पैन (फैक्टरी) का उपयोग करता है

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

 class RestaurantObjectBuilder { IFactory _factory = new DefaultFoodFactory(); //This can be used when you want to plugin the public void SetFoodFactory(IFactory customFactory) { _factory = customFactory; } public IFactory GetFoodFactory() { return _factory; } } 

बिल्डर का एक और फायदा यह है कि यदि आपके पास फैक्टरी है, तो अभी भी आपके कोड में कुछ युग्मन है, क्योंकि कारखाने को काम करने के लिए, उसे सभी वस्तुओं को जानना होगा जो संभवतः इसे बना सकते हैं । यदि आप एक ऐसी वस्तु जोड़ते हैं जिसे बनाया जा सकता है, तो आपको उसे शामिल करने के लिए कारखाना वर्ग को संशोधित करना होगा। यह सार फैक्ट्री में भी होता है

बिल्डर के साथ, दूसरी तरफ, आपको इस नए वर्ग के लिए एक नया कंक्रीट बिल्डर बनाना होगा। निर्देशक वर्ग एक ही रह जाएगा, क्योंकि यह निर्माता में निर्माता को प्राप्त करता है।

इसके अलावा, बिल्डर के कई स्वाद हैं Kamikaze मर्सिनेरी एक और एक देता है।

पिछले उत्तर (यमक इरादा) पर बिल्डिंग, एक उत्कृष्ट वास्तविक दुनिया का उदाहरण Builders समर्थन में ग्रोवी का निर्माण किया गया है

  • ग्रूवी के MarkupBuilder का उपयोग करते हुए एक्सएमएल बनाना
  • ग्रूवी के StreamingMarkupBuilder मार्कअप बिल्डर का उपयोग कर एक्सएमएल बनाना
  • स्विंग बिल्डर
  • SwingXBuilder

ग्रोवी दस्तावेज़ीकरण में बिल्डर्स देखें

 /// <summary> /// Builder /// </summary> public interface IWebRequestBuilder { IWebRequestBuilder BuildHost(string host); IWebRequestBuilder BuildPort(int port); IWebRequestBuilder BuildPath(string path); IWebRequestBuilder BuildQuery(string query); IWebRequestBuilder BuildScheme(string scheme); IWebRequestBuilder BuildTimeout(int timeout); WebRequest Build(); } /// <summary> /// ConcreteBuilder #1 /// </summary> public class HttpWebRequestBuilder : IWebRequestBuilder { private string _host; private string _path = string.Empty; private string _query = string.Empty; private string _scheme = "http"; private int _port = 80; private int _timeout = -1; public IWebRequestBuilder BuildHost(string host) { _host = host; return this; } public IWebRequestBuilder BuildPort(int port) { _port = port; return this; } public IWebRequestBuilder BuildPath(string path) { _path = path; return this; } public IWebRequestBuilder BuildQuery(string query) { _query = query; return this; } public IWebRequestBuilder BuildScheme(string scheme) { _scheme = scheme; return this; } public IWebRequestBuilder BuildTimeout(int timeout) { _timeout = timeout; return this; } protected virtual void BeforeBuild(HttpWebRequest httpWebRequest) { } public WebRequest Build() { var uri = _scheme + "://" + _host + ":" + _port + "/" + _path + "?" + _query; var httpWebRequest = WebRequest.CreateHttp(uri); httpWebRequest.Timeout = _timeout; BeforeBuild(httpWebRequest); return httpWebRequest; } } /// <summary> /// ConcreteBuilder #2 /// </summary> public class ProxyHttpWebRequestBuilder : HttpWebRequestBuilder { private string _proxy = null; public ProxyHttpWebRequestBuilder(string proxy) { _proxy = proxy; } protected override void BeforeBuild(HttpWebRequest httpWebRequest) { httpWebRequest.Proxy = new WebProxy(_proxy); } } /// <summary> /// Director /// </summary> public class SearchRequest { private IWebRequestBuilder _requestBuilder; public SearchRequest(IWebRequestBuilder requestBuilder) { _requestBuilder = requestBuilder; } public WebRequest Construct(string searchQuery) { return _requestBuilder .BuildHost("ajax.googleapis.com") .BuildPort(80) .BuildPath("ajax/services/search/web") .BuildQuery("v=1.0&q=" + HttpUtility.UrlEncode(searchQuery)) .BuildScheme("http") .BuildTimeout(-1) .Build(); } public string GetResults(string searchQuery) { var request = Construct(searchQuery); var resp = request.GetResponse(); using (StreamReader stream = new StreamReader(resp.GetResponseStream())) { return stream.ReadToEnd(); } } } class Program { /// <summary> /// Inside both requests the same SearchRequest.Construct(string) method is used. /// But finally different HttpWebRequest objects are built. /// </summary> static void Main(string[] args) { var request1 = new SearchRequest(new HttpWebRequestBuilder()); var results1 = request1.GetResults("IBM"); Console.WriteLine(results1); var request2 = new SearchRequest(new ProxyHttpWebRequestBuilder("localhost:80")); var results2 = request2.GetResults("IBM"); Console.WriteLine(results2); } } 

मैंने बिल्डर को घर वाले मैसेजिंग लाइब्रेरी में इस्तेमाल किया। लाइब्रेर कोर तार से डेटा प्राप्त कर रहा था, इसे बिल्डर इंस्टेंस के साथ इकट्ठा किया, तब, जब बिल्डर ने फैसला किया कि एक संदेश इंस्टेंस बनाने के लिए उसे सब कुछ मिल गया, तो बिल्डर। GetMessage () एक आंकड़ा निर्माण कर रहा था तार।

जब मैं अपने XML के लिए मानक XMLGregorianCalendar का उपयोग जावा में दिनांकटाइम के मार्शलिंग को ऑब्जेक्ट करने के लिए करना चाहता था, तो मैंने बहुत से टिप्पणियां सुनीं कि यह कितना भारी वजन और बोझल का उपयोग करना था मैं xs में एक्सएमएल फ़ील्ड्स को कम्यूट्रोल करने का प्रयास कर रहा था: टाइमज़ोन structs को समयक्षेत्र, मिलीसेकेंड, आदि का प्रबंधन करने के लिए।

इसलिए मैंने एक ग्रेगोरियन कैलेंड्रर या जावा.टिल.डेट से एक XMLGregorian कैलेंडर बनाने के लिए उपयोगिता बनाया है।

जहां मैं काम करता हूं, इसलिए मुझे इसे बिना कानूनी रूप से ऑनलाइन साझा करने की अनुमति नहीं है, लेकिन यहां यह एक उदाहरण है कि ग्राहक इसका उपयोग कैसे करता है। यह विवरण को सारबद्ध करता है और XMLGregorianCalendar के कुछ कार्यान्वयन को फ़िल्टर करता है जो कि xs: datetime के लिए कम उपयोग किया जाता है।

 XMLGregorianCalendarBuilder builder = XMLGregorianCalendarBuilder.newInstance(jdkDate); XMLGregorianCalendar xmlCalendar = builder.excludeMillis().excludeOffset().build(); 

मान लिया गया कि यह पैटर्न एक फिल्टर के अधिक है क्योंकि यह फ़ील्ड को एक्सएमएलएक्लेण्डर के रूप में अनिर्धारित रूप से निर्धारित करता है, ताकि उन्हें बाहर रखा जा सके, यह अभी भी "बनाता है" मैंने आसानी से बिल्डर के लिए अन्य विकल्पों को एक्सएस: डेट, और एक्सएस: टाइम स्ट्रक्चर बनाने और जरूरत पड़ने पर टाइमज़ोन ऑफसेट को हेरफेर करने के लिए जोड़ा है।

यदि आपने कभी भी कोड बनाया है जो XMLGregorianCalendar बनाता है और उपयोग करता है, तो आप देखेंगे कि यह कैसे हेरफेर करने में आसान बना दिया।

मैं हमेशा बिल्डर पैटर्न को नापसंद कर रहा हूं क्योंकि कम अनुभवी प्रोग्रामर द्वारा बोझल, घुसपैठ और अक्सर दुर्व्यवहार किया गया है। यह एक पैटर्न है जो केवल समझ में आता है अगर आपको कुछ डेटा से ऑब्जेक्ट इकट्ठा करने की आवश्यकता होती है जिसके लिए एक पोस्ट-इनिशियलाइज़ेशन चरण की आवश्यकता होती है (अर्थात एक बार सभी डेटा एकत्र किया जाता है – इसके साथ कुछ करें)। इसके बजाय, 99% समय बिल्डर का इस्तेमाल केवल क्लास सदस्यों को आरंभ करने के लिए किया जाता है।

ऐसे मामलों में क्लास के अंदर withXyz(...) प्रकार सेटर्स के साथ घोषित करने और उन्हें खुद के संदर्भ में वापस करने के लिए बस इतना बेहतर होता है।

इस पर विचार करो:

 public class Complex { private String first; private String second; private String third; public String getFirst(){ return first; } public void setFirst(String first){ this.first=first; } ... public Complex withFirst(String first){ this.first=first; return this; } public Complex withSecond(String second){ this.second=second; return this; } public Complex withThird(String third){ this.third=third; return this; } } Complex complex = new Complex() .withFirst("first value") .withSecond("second value") .withThird("third value"); 

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

InnerBuilder, एक IntelliJ IDEA प्लगइन देखें जो उत्पन्न मेनू (Alt + Insert) पर एक 'बिल्डर' कार्रवाई जोड़ता है जो प्रभावी जावा में वर्णित के रूप में एक आंतरिक निर्माता वर्ग उत्पन्न करता है

https://github.com/analytically/innerbuilder

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

उदाहरण:

वर्ग:

 public class CustomAuthenticationService { private ICloudService _cloudService; private IDatabaseService _databaseService; public CustomAuthenticationService(ICloudService cloudService, IDatabaseService databaseService) { _cloudService = cloudService; _databaseService = databaseService; } public bool IsAuthorized(User user) { //Implementation Details return true; } 

परीक्षा:

  [Test] public void Given_a_User_With_Permission_When_Verifying_If_Authorized_Then_Authorize_It_Returning_True() { CustomAuthenticationService sut = new CustomAuthenticationServiceBuilder(); User userWithAuthorization = null; var result = sut.IsAuthorized(userWithAuthorization); Assert.That(result, Is.True); } 

बिल्डर बिल्डर:

 public class CustomAuthenticationServiceBuilder { private ICloudService _cloudService; private IDatabaseService _databaseService; public CustomAuthenticationServiceBuilder() { _cloudService = new AwsService(); _databaseService = new SqlServerService(); } public CustomAuthenticationServiceBuilder WithAzureService(AzureService azureService) { _cloudService = azureService; return this; } public CustomAuthenticationServiceBuilder WithOracleService(OracleService oracleService) { _databaseService = oracleService; return this; } public CustomAuthenticationService Build() { return new CustomAuthenticationService(_cloudService, _databaseService); } public static implicit operator CustomAuthenticationService (CustomAuthenticationServiceBuilder builder) { return builder.Build(); } }