गोफ द्वारा मूल बिल्डर पैटर्न और जोशुआ ब्लोच द्वारा "संशोधित गोफ बिल्डर पैटर्न" के बीच क्या अंतर है?संशोधित बिल्डर पैटर्न क्या है?
उत्तर
गोफ पैटर्न निर्माण के चरणों को सारणीबद्ध करने पर केंद्रित है ताकि बिल्डर को बदलकर आप अलग-अलग परिणाम प्राप्त कर सकें जबकि "संशोधित निर्माता" कई रचनाकारों द्वारा अनावश्यक जटिलता की समस्या को लक्षित कर रहा है। तो गोफ पैटर्न अमूर्तता के बारे में अधिक है और संशोधित पटर सादगी (आईएमओ) के बारे में अधिक है।
http://en.wikipedia.org/wiki/Builder_pattern और http://rwhansen.blogspot.com/2007/07/theres-builder-pattern-that-joshua.html में उदाहरणों को देखें और यह स्पष्ट होना चाहिए।
नोट Mikko's answer: Hansen's example में कुछ समस्याएं हैं - या, कम से कम, ब्लोच के संस्करण से भिन्नताएं, हालांकि मुझे लगता है कि ब्लोच का संस्करण बेहतर है।
विशेष रूप से:
पहले, Widget
के क्षेत्रों Builder.build()
में नहीं बल्कि Widget
निर्माता की तुलना में स्थापित कर रहे हैं, और इसलिए नहीं कर रहे हैं (और नहीं हो सकता है) final
। Widget
अपरिवर्तनीय कहा जाता है, लेकिन बाद में सेटर्स जोड़ने और जोड़ने से दूसरे प्रोग्रामर को हतोत्साहित करने के लिए कुछ भी नहीं है।
दूसरा, हैंनसेन की बिल्ड विधि में टिप्पणियां कहती हैं, "पूर्व-निर्माण सत्यापन यहां जाता है"। बलोच (। ईजे 2ed पी .15) का कहना है:
यह महत्वपूर्ण है कि [अपरिवर्तनशीलताओं] ऑब्जेक्ट के लिए बिल्डर से मानकों को कॉपी करने के बाद जाँच की जानी है, और है कि वे बजाय वस्तु क्षेत्रों पर जाँच की जानी बिल्डर फ़ील्ड (आइटम 39)।
[यह] एक और धागे से पैरामीटर में परिवर्तन के खिलाफ वर्ग की रक्षा करता है "असुरक्षा की खिड़की" के बीच के दौरान:
आप आइटम 39 के लिए फ्लिप है (पी। 185) आप तर्क देखना समय पैरामीटर की जांच की जाती है और जिस समय उनकी प्रतिलिपि बनाई जाती है।
Widget
में खेतों अपरिवर्तनीय हैं और किसी भी बचाव की मुद्रा में नकल की आवश्यकता नहीं है, लेकिन फिर भी यह सिर्फ सही पैटर्न से चिपक सुरक्षित है, मामले में किसी को साथ आता है और बाद में एक Date
या किसी सरणी या कुछ परिवर्तनशील Collection
कहते हैं । (यह भी एक और धागा build()
करने के लिए एक कॉल के बीच में Builder
को संशोधित करने के खिलाफ रक्षा करता है, लेकिन तो यह शायद सबसे अच्छा बस सुनिश्चित Builder
रों धागे के बीच साझा नहीं कर रहे हैं कि सुरक्षा की एक बहुत संकीर्ण खिड़की है।)
एक अधिक Blochlike संस्करण होगा:
public class Widget {
public static class Builder {
private String name;
private String model;
private String serialNumber;
private double price;
private String manufacturer;
public Builder(String name, double price) {
this.name = name;
this.price = price;
}
public Widget build() {
Widget result = new Widget(this);
// *Post*-creation validation here
return result;
}
public Builder manufacturer(String value) {
this.manufacturer = value;
return this;
}
public Builder serialNumber(String value) {
this.serialNumber = value;
return this;
}
public Builder model(String value) {
this.model = value;
return this;
}
}
private final String name;
private final String model;
private final String serialNumber;
private final double price;
private final String manufacturer;
/**
* Creates an immutable widget instance.
*/
private Widget(Builder b) {
this.name = b.name;
this.price = b.price;
this.model = b.model;
this.serialNumber = b.serialNumber;
this.manufacturer = b.manufacturer;
}
// ... etc. ...
}
सभी Widget
क्षेत्रों अब final
हैं, और सभी निर्माण के बाद मान्य किए जाते हैं।
- 1. बिल्डर पैटर्न
- 2. बिल्डर पैटर्न
- 3. डिजाइन पैटर्न: बिल्डर
- 4. स्ट्रिंगबिल्डर और बिल्डर पैटर्न
- 5. जावा विरासत, बिल्डर पैटर्न
- 6. जैक्सन + बिल्डर पैटर्न?
- 7. जावा बिल्डर पैटर्न के बराबर स्केल क्या है?
- 8. बिल्डर पैटर्न और दृढ़ता
- 9. जावा जेनरिक + बिल्डर पैटर्न
- 10. Refactor बिल्डर पैटर्न या Telescoping निर्माता पैटर्न
- 11. बिल्डर डिजाइन पैटर्न के नुकसान
- 12. क्या यह संशोधित सी # सिंगलटन पैटर्न एक अच्छा अभ्यास है?
- 13. क्या बिल्डर पैटर्न के लिए कोई विशिष्ट शब्द है जहां प्रत्येक विधि 'यह` लौटाती है?
- 14. बिल्डर डिज़ाइन पैटर्न - कोई सार श्रेणी/इंटरफ़ेस
- 15. जावा एपीआई में बिल्डर पैटर्न का उदाहरण?
- 16. आंतरिक कक्षाओं के बिना PHP बिल्डर पैटर्न
- 17. बिल्डर
- 18. बिल्डर पैटर्न और टेम्पलेट विधि (बिल्डर बनाम टेम्पलेट) के बीच मतभेद
- 19. क्या यह एक अपरिवर्तनीय वर्ग और बिल्डर पैटर्न का वैध जावा कार्यान्वयन है?
- 20. क्या यह एक आम डिजाइन पैटर्न है? "वर्णनकर्ता पैटर्न"?
- 21. क्या CFDUMP टैग संशोधित है?
- 22. यह पैटर्न क्या है?
- 23. विरोधी पैटर्न क्या है?
- 24. 'समग्र पैटर्न' क्या है?
- 25. बिल्डर पैटर्न में ऑर्डर प्रबंधित करने का पसंदीदा तरीका क्या है?
- 26. क्या आप इंटरफ़ेस बिल्डर
- 27. इस पैटर्न को क्या कहा जाता है?
- 28. मुझे बिल्डर डिजाइन पैटर्न का उपयोग कब करना चाहिए?
- 29. क्या ऐसा JSON स्ट्रिंग बिल्डर मौजूद है?
- 30. ग्रहण - बिल्कुल एक बिल्डर क्या है?
क्या आपका उदाहरण बिगस (या गायब, अस्थिर) गुणों के साथ बिल्डर का कुछ उदाहरण बनाने की अनुमति नहीं देगा और फिर "नया विजेट (myBogusBuilder)" कॉल करें और विजेट के "अस्थिर" उदाहरण के साथ समाप्त हो जाएगा? (उदाहरण के लिए, यह मान्य नहीं है कि कीमत "1" से कम से कम होनी चाहिए, क्योंकि आप केवल उस बिल्ड() विधि में जांच लेंगे) – Rafa
यह होगा कि विजेट कन्स्ट्रक्टर सार्वजनिक था, लेकिन यह निजी है। इसे कॉल करने का एकमात्र तरीका (कक्षा के बाहर से) बिल्ड() के माध्यम से है। –
ओह, सच; ध्यान नहीं दिया (मेरे चश्मे की समीक्षा करने के लिए ...)। धन्यवाद :) – Rafa