2010-09-15 2 views
5

द्वारा पेश बिल्डर पैटर्न पर कुछ संशोधन जो मैं यहोशू ब्लोच द्वारा पेश किए गए जावा बिल्डर पैटर्न का उपयोग करता हूं। कभी-कभी, मुझे कुछ फ़ील्ड मिलते हैं जो आदिम प्रकारों की तुलना में डिफ़ॉल्ट मान के साथ प्रारंभ करने के लिए अधिक महंगे होते हैं।जोशुआ ब्लोच

इसलिए, मेरी रणनीति क्या है।

  1. मैं उन क्षेत्रों के लिए डिफ़ॉल्ट मान प्रारंभिक संचालन में देरी करता हूं।
  2. निर्माण के दौरान, मैं उन्हें केवल डिफ़ॉल्ट मान पर प्रारंभ कर दूंगा, अगर वे पहले कॉलर द्वारा सेट नहीं हैं।

मुझे यकीन नहीं है कि यह अच्छा ऐसा करने के लिए है? क्या कोई पकड़ हो सकती है? जैसे, थ्रेड सुरक्षा मुद्दे? अब तक, मुझे इसके साथ कोई समस्या नहीं दिख रही है।

package sandbox; 

import java.util.Calendar; 

/** 
* 
* @author yccheok 
*/ 
// Builder Pattern 
public class NutritionFacts { 
    private final int servingSize; 
    private final int servings; 
    private final int calories; 
    private final int fat; 
    private final int sodium; 
    private final int carbohydrate; 

    private final java.util.Calendar calendar; // !!! 

    public static class Builder { 
     // Required parameters 
     private final int servingSize; 
     private final int servings; 
     // Optional parameters - initialized to default values 
     private int calories = 0; 
     private int fat = 0; 
     private int carbohydrate = 0; 
     private int sodium = 0; 

     // We suppose to provide a default value for calendar. However, it may 
     // seem expensive. We will do it later during build.   
     private java.util.Calendar calendar = null; 

     public Builder(int servingSize, int servings) { 
      this.servingSize = servingSize; 
      this.servings = servings; 
     } 
     public Builder calories(int val) 
     { calories = val; return this; } 
     public Builder fat(int val) 
     { fat = val; return this; } 
     public Builder carbohydrate(int val) 
     { carbohydrate = val; return this; } 
     public Builder sodium(int val) 
     { sodium = val; return this; } 

     public NutritionFacts build() { 
      // !!! 
      if (this.calendar == null) { 
       this.calendar = Calendar.getInstance(); 
      }    
      return new NutritionFacts(this); 
     } 
    } 

    private NutritionFacts(Builder builder) { 
     servingSize = builder.servingSize; 
     servings = builder.servings; 
     calories = builder.calories; 
     fat = builder.fat; 
     sodium = builder.sodium; 
     carbohydrate = builder.carbohydrate; 
     calendar = builder.calendar; 
    } 
} 

उत्तर

4

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

+1

ठीक है। यह मुझे याद दिलाता है। जब उपयोगकर्ता स्पष्ट रूप से कैलेंडर सेट कर रहा है तो शायद मुझे एक बुलियन ध्वज गंदा होना चाहिए। फिर निर्माण के दौरान, मैं बुलियन ध्वज की जांच करूंगा? –

+0

हाँ मुझे लगता है कि काम करेगा – nanda

3

मुझे इसके साथ कोई समस्या नहीं दिख रही है। बिल्डर पैटर्न वास्तव में एक एपीआई है जो कुछ कार्यों के साथ मदद करता है। जब तक आप पैटर्न/एपीआई के सिद्धांतों का पालन नहीं करते हैं, तब तक आप एपीआई के कवर के तहत जो भी चाहें कर सकते हैं। मुझे लगता है कि महंगा संसाधनों की आलसी लोडिंग ठीक है, बस सुनिश्चित करें कि आप किसी भी व्यवहार को दस्तावेज करते हैं जो आपको लगता है कि डेवलपर्स को पता होना चाहिए।

2

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

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