2011-04-09 18 views
10

उपयोग करने के लिए प्रभावी जावा 2ed मद 2Refactor बिल्डर पैटर्न या Telescoping निर्माता पैटर्न

telescoping निर्माता पैटर्न के अनुसार, जो आप केवल आवश्यक मानकों के साथ एक निर्माता प्रदान में, एक और साथ एक वैकल्पिक पैरामीटर, तीसरा दो वैकल्पिक पैरामीटर, और इसी तरह, कन्स्ट्रक्टर में सभी वैकल्पिक पैरामीटर के साथ समाप्त होता है।

वर्ग इस पद्धति को लागू करने की कंस्ट्रक्टर्स का एक उदाहरण When would you use the Builder Pattern?

कोड सेट 1 ए से लिया गया है

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

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

कोड सेट 1b

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

एक और उदाहरण

कोड 2

public AttributeKey(String key, Class<T> clazz) 
public AttributeKey(String key, Class<T> clazz) 
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed) 
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed, @Nullable ResourceBundleUtil labels) 

दो नवीनतम उदाहरण मैं दिया पालन नहीं किया सेट करते है लक्षण कोड सेट 1 ए के रूप में निर्माता telescoping के आईसी

  1. किया कोड सेट -1 बी और 2 निर्माता telescoping में शामिल कर रहे हैं? यदि नहीं, तो इसे क्या कहा जाता है?
  2. बिल्डर पैटर्न है, जो एक का उपयोग करने के लिए की तुलना (बिल्डर के बीच और कोड सेट 1a के पैटर्न, 2) और अधिक लाभ
+1

दोनों 1 बी और 2 संकलन-समय त्रुटियां देते हैं, क्योंकि उनके समान हस्ताक्षर वाले दो निर्माता हैं। – Superole

+0

अन्य उत्तर http://stackoverflow.com/a/1953567/632951 अधिक जानकारी देगा ... – Pacerier

उत्तर

1

इस मामले में, मैं या तो निर्माता या एक अलग तंत्र के लिए जाऊंगा जहां कॉलर टॉपिंग का संग्रह पास कर सकता है। अगर आपको यह सत्यापित करने की आवश्यकता है कि टॉपिंग की अनुमति है, तो आप इसे कन्स्ट्रक्टर या टॉपिंग्स सेटटर में कर सकते हैं। टेलीस्कोपिंग/चेनिंग कन्स्ट्रक्टर दृष्टिकोण के लिए आपको टॉपिंग्स के अतिरिक्त संयोजनों को संभालने के लिए भविष्य में अतिरिक्त कन्स्ट्रक्टर जोड़ने की आवश्यकता हो सकती है, जबकि एक संग्रह दृष्टिकोण स्वचालित रूप से किसी परिदृश्य को संभालेगा। मैं विभिन्न प्रकार के टॉपिंग के लिए पिज्जा वर्ग में विशिष्ट गुण रखने से भी बचूंगा। अगर आपको अतिरिक्त पनीर को संभालने की ज़रूरत है तो क्या होगा? एक cheese बूलियन इसे संभाल नहीं पाएगा। Topping वर्ग सबक्लास के साथ एक पूर्ण वस्तु हो सकता है, या आप इसे केवल एक स्ट्रिंग के साथ बदल सकते हैं।

public class Pizza 
{ 
    // setters don't have to be private... 
    public int Size {get; private set;} 
    private List<Topping> toppings {get; private set;} 

    public Pizza(int size) : this(size, new List<Topping>()) // call the other ctor with an empty list of toppings 
    { 
    } 

    public Pizza(int size, List<Topping> toppings) 
    { 
     Size = size; 
     Toppings = toppings; 
    } 
} 
2

क्या constructors'parameters की इस पद्धति कहा जाता है प्रदान करता है?

यह प्रति डिज़ाइन पैटर्न नहीं है, लेकिन यह एक प्रोग्रामिंग तकनीक है जिसे कन्स्ट्रक्टर चेनिंग कहा जाता है। When would you use the Builder Pattern? है कि आप भी उधार लिया अंतर अच्छी तरह से बताते हैं:

बिल्डर पैटर्न है, जो एक और अधिक लाभ

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

उम्मीद है कि मदद करता है।

+0

जानकारीपूर्ण SO लिंक! – ritesht93

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