2015-02-04 10 views
5

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

public class Test { 
    public static void main(String[] args) { 
     Numbers first = new Numbers.Builder().setD(3.14).build(); 
     System.out.println(first); 
     Numbers second = new Numbers.Builder().setI(17).setF(1.24F).build(); 
     System.out.println(second); 
     System.out.println(first); 
    } 
} 

final class Numbers { 
    private int i; 
    private long l; 
    private float f; 
    private double d; 

    private Numbers() {} 


    public static class Builder { 
     private final Numbers instance = new Numbers(); 

     public Builder setI(int i) { 
      instance.i = i; 
      return this; 
     } 

     public Builder setL(long l) { 
      instance.l = l; 
      return this; 
     } 

     public Builder setF(float f) { 
      instance.f = f; 
      return this; 
     } 

     public Builder setD(double d) { 
      instance.d = d; 
      return this; 
     } 

     public Numbers build() { 
      return instance; 
     } 
    } 

    @Override 
    public String toString() { 
     return String.format("%4d %4d %7.3f %7.3f", i, l, f, d); 
    } 
} 

है या मैं कुछ छूट गया हो?

संपादित

इस बारे में

क्या?

//... 

private Numbers() {} 


private Numbers(Numbers o) { 
     i = o.i; 
     l = o.l; 
     f = o.f; 
     d = o.d; 
    } 

public static class Builder { 
     private final Numbers instance = new Numbers(); 

      //... 

     public Numbers build() { 
      return new Numbers(instance); 
     } 
    } 
+5

इस दृष्टिकोण के साथ एक बड़ी समस्या यह है कि यदि आप एक ही निर्माता पर कई बार बिल्ड() कहते हैं, तो आप हर बार एक ही उदाहरण के साथ समाप्त होते हैं। –

+0

@ जेबी निजेट ओह, दाएं, बिल्डर सार्वजनिक है-_- ty – Dmytro

+0

बिल्ड() विधि –

उत्तर

4

अपने कोड के साथ समस्या यह है कि अगर आप एक ही Builder उदाहरण के लिए दो बार build कहते हैं, आप एक ही Numbers उदाहरण मिलेगा। और यदि आप build कहने के बाद Builder के तरीकों को कॉल करते हैं और Numbers उदाहरण प्राप्त करते हैं, तो आप उस उदाहरण को बदल देंगे। बिल्डर द्वारा बनाई गई घटना को बिल्डर से स्वतंत्र होने के बाद स्वतंत्र होना चाहिए।

+0

के अंदर बिल्डर इंस्टेंस बनाएं, अब मैं देख रहा हूं, धन्यवाद। – Dmytro

+4

इसके साथ अन्य समस्याएं हैं कि इसका मतलब है कि आपके कोई भी फ़ील्ड 'अंतिम' नहीं हो सकता है, और आपका कन्स्ट्रक्टर फ़ील्ड पर कोई सत्यापन नहीं कर सकता है (शायद आप कुछ तर्क चाहते हैं जो एकाधिक फ़ील्ड पर निर्भर करता है, जैसे "अगर मैं == 3 तो एफ नकारात्मक नहीं हो सकता ")। – yshavit

+0

@yshavit तो अब (संपादन के बाद) इस दृष्टिकोण का नुकसान यह है कि मैं invariants की जांच नहीं कर सकता? – Dmytro

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