2010-01-30 17 views
12

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

क्या जावा मानक पुस्तकालयों में कोई एपीआई है जो बिल्डर पैटर्न का उपयोग करती है? मैं जावा पुस्तकालयों के मूल सेट के भीतर अपने उपयोग को आगे बढ़ाने से पहले वास्तविक कार्यान्वयन के लिए पुस्तक में सुझावों की तुलना करना चाहता हूं।

+0

आप इस एसई प्रश्न में उदाहरण मिल सकते हैं: http://stackoverflow.com/questions/1673841/उदाहरण-के-गोफ-डिज़ाइन-पैटर्न-इन-जावा-कोर-लाइब्रेरीज़? Rq = 1 –

उत्तर

17

मैं कोर JDK भीतर बारे में निश्चित नहीं हूँ, लेकिन अच्छे उदाहरण Guava में पाया जा सकता। MapMaker शायद सबसे अच्छा उदाहरण है जो मैं अपने सिर के ऊपर से सोच सकता हूं। उदाहरण के लिए, डॉक्स से लिए:

ConcurrentMap<Key, Graph> graphs = new MapMaker() 
    .concurrencyLevel(32) 
    .softKeys() 
    .weakValues() 
    .expiration(30, TimeUnit.MINUTES) 
    .makeComputingMap(
     new Function<Key, Graph>() { 
      public Graph apply(Key key) { 
      return createExpensiveGraph(key); 
      } 
     }); 

हाँ, बात इस तरह की "मानक" जावा नामकरण के अनाज के खिलाफ जा सकते हैं, लेकिन यह भी बहुत पठनीय हो सकता है।

ऐसी परिस्थितियों के लिए जहां आप "यह" नहीं लौट रहे हैं, लेकिन एक नई वस्तु (आमतौर पर अपरिवर्तनीय प्रकारों के साथ) मुझे "उपसर्ग" पसंद है - जोडा टाइम उस पैटर्न का व्यापक रूप से उपयोग करता है। यह निर्माता पैटर्न नहीं है, बल्कि एक वैकल्पिक और संबंधित निर्माण फार्म है।

0

यह मानक लाइब्रेरी में केवल परिभाषित (लागू नहीं) है, हालांकि, जेडीबीसी डेटासोर्स ऑब्जेक्ट्स मुझे बिल्डर पैटर्न की याद दिलाता है। आप डेटासोर्स ऑब्जेक्ट बनाते हैं और फिर आप कई गुण सेट करते हैं और फिर आप कनेक्शन बनाते हैं।

यहाँ एक कोड उदाहरण है ...

DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB"); 
ds.setServerName("my_database_server"); 
ds.setDescription("the data source for inventory and personnel"); 
Connection con = ds.getConnection("genius", "abracadabra"); 
0

प्रोसेसबिल्डर बिल्डर पैटर्न का एक उदाहरण है, लेकिन जावा नामकरण सम्मेलनों का काफी उपयोग नहीं कर रहा है।

 
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
Process p = pb.start(); 

एसक्यूएल पैकेज में, PreparedStatement बिल्डर पैटर्न का एक उदाहरण माना जा सकता है:

 
PreparedStatement stmt = conn.prepareStatement(getSql()); 
stmt.setString(1, ...); 
stmt.setString(2, ...); 
ResultSet rs = stmt.executeQuery(); 
... 
stmt.setString(2, ...); 
rs = stmt.executeQuery(); 
... 
+3

यह पूर्णकालिक bui नहीं है यदि आप चेन विधियों नहीं कर सकते हैं तो lder पैटर्न। – BalusC

4

केवल बिल्डर प्रभावी जावा किताब करने के लिए सबसे सटीक StringBuilder है। उदाहरण से मैं केवल अंतर देखता हूं कि यह निर्माता स्ट्रिंग का आंतरिक वर्ग नहीं है।

सभी विधियां बिल्डर ऑब्जेक्ट को चेन पर लौटती हैं। और toString() विधि बिल्ड() विधि है।

+0

'स्ट्रिंगबिल्डर' बिल्डर पैटर्न का कार्यान्वयन नहीं है, सिर्फ इसलिए कि इसका नाम बिल्डर कहता है, यह एक नया 'ऑब्जेक्ट' वापस नहीं करता है, इसके विपरीत इसके विपरीत होता है। शांति। –

0

SAXParser अच्छा उदाहरण हो रहा है: - निदेशक

  • ContentHandler -

    • SAXParser बिल्डर

    SAXParser की विशिष्ट उपयोग बिल्डर के साथ समान होता है:

    // Create Director 
    SAXParser parser = new org.apache.xerces.parsers.SAXParser(); 
    // Create Concrete Builder (our own class) 
    IdentingContentHandler handler = new IndentingContentHandler(); 
    // Set Buidler to Director 
    parser.setContentHandler(handler); 
    // Build 
    parser.parse(new InputSource(new FileReader(fileName)); 
    // Get indented XML as String from handler 
    String identedXML = handler.getResult(); 
    
  • 0

    जावा 8 कोर एपीआई से सुंदर अच्छा उदाहरण Calendar है, उदाहरण के लिए आप का उपयोग कर सकते हैं:

    Calendar cal = new Calendar.Builder().setCalendarType("iso8601") 
             .setWeekDate(2013, 1, MONDAY).build(); 
    

    Java 7 से एक और अच्छा उदाहरण Locale, इस्तेमाल होता है:

    Locale aLocale = new Builder().setLanguage("sr").setScript("Latn").setRegion("RS").build(); 
    

    बिल्डर पैटर्न अपरिवर्तनीय वस्तुओं के संदर्भ में सबसे उपयोगी है। दिलचस्प बात यह है कि जावा में कई म्यूटेबल बिल्डर्स हैं, StringBuilder सबसे आम हैं। जावा 8 से परिवर्त्य बिल्डरों:

    • Stream.Builder
    • IntStream.Builder
    • LongStream.Builder
    • DoubleStream.Builder
    संबंधित मुद्दे