2013-10-02 7 views
5

कक्षा के बाहर बनाम बिल्डर पैटर्न का उपयोग करने के बीच क्या फायदे हैं?बाहरी वर्ग बनाम बिल्डर पैटर्न?

अंदर वर्ग:

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person setName(String name) { 
     this.name = name; 
     return this; 
    } 

    public Person setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public Person setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new Person() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 

बाहर वर्ग:

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person(String name, String eyeColor, String hairColor) { 
     this.name = name; 
     this.eyeColor = eyeColor; 
     this.hairColor = hairColor; 
    } 
} 

public class PersonBuilder { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person build() { 
     return new Person(name, eyeColor, hairColor); 
    } 

    public PersonBuilder with(String name) { 
     this.name = name; 
     return this; 
    } 

    public PersonBuilder setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public PersonBuilder setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new PersonBuilder() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 
       .build(); 
+0

यह राय आधारित है ... लेकिन मुझे लगता है कि यह अव्यवस्था को कम करने के अंदर है। आपके पास MyClass.Builder, MyClass2.builder, आदि हो सकते हैं - और MyClassBuilder, MyClass2Builder, आदि वर्गों का पूरा समूह नहीं है – ppeterka

+0

साधारण चीजों के लिए यह वास्तव में कोई फर्क नहीं पड़ता है, हालांकि आप किसी अन्य के लिए सेटटर रिटर्न प्रकारों का उपयोग करना चाह सकते हैं संकेत (जटिल सेटर्स में) जिस स्थिति में बाहरी व्यक्ति ने अधिक लचीलापन दिया होगा। व्यक्तिगत रूप से मैं बाहरी के साथ जाऊंगा। – Thihara

+0

आईएमएचओ, बिल्डर एक आंतरिक वर्ग होना चाहिए क्योंकि इसका उपयोग कक्षा के निर्माण द्वारा विशेष रूप से किया जाना है। इसके कारण, इसे नियमित कक्षा बनाने में कोई वास्तविक लाभ नहीं है। – hfontanez

उत्तर

7

यह निर्भर करता है।

मैं अक्सर Builder और Factory पैटर्न जोड़ता हूं इसलिए बिल्डर को "निर्मित" ऑब्जेक्ट कई कार्यान्वयनों में से एक होने के बाद बाहरी कक्षा के रूप में रखना समझ में आता है। कार्यान्वयन को निजी या यहां तक ​​कि बिल्डर के निजी आंतरिक वर्गों को पैकेज करने की अनुमति देने का एक अतिरिक्त लाभ है।

यदि आप बिल्डर का उपयोग कर रहे हैं तो बस एक सार्वजनिक वर्ग के निर्माता को अधिक इरादा प्रकट करना या इससे कम अव्यवस्थित होना वास्तव में व्यक्तिगत वरीयता है। कोई एपीआई में अतिरिक्त कक्षा रखने के पेशेवरों और विपक्ष का वजन कर सकता है जो उपयोगकर्ताओं के लिए भ्रमित कर सकता है।

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

इस तरह भीतरी और बाहरी बिल्डर्स मिश्रण मत करो:

Foo foo = new Foo.Builder(...) 

Bar bar = new BarBuilder(...) 
1

2 कार्यान्वयन आपको विश्वास दिलाता हूं कि आप एक समाप्त वस्तु पाने के लिए और इस तरह बनाती हूँ इसे और अधिक विश्वसनीय कार्यान्वयन जबकि पहले अनकहा तक यू है सभी क्षेत्रों को खत्म करना खत्म करें।

सामान्य रूप से आप अस्थिर ऑब्जेक्ट को उपयोग के लिए उपलब्ध नहीं करना चाहते हैं।

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