जावा के मुख्य पुस्तकालयों में जीओएफ डिज़ाइन पैटर्न के उदाहरण


672

मैं GoF जावा डिजाइन पैटर्न सीख रहा हूं और मैं उनमें से कुछ वास्तविक जीवन उदाहरण देखना चाहता हूं। जावा के मुख्य पुस्तकालयों में इन डिज़ाइन पैटर्न के कुछ अच्छे उदाहरण क्या हैं?

जवाबों:


3229

आप विकिपीडिया में बहुत सारे डिज़ाइन पैटर्न का अवलोकन पा सकते हैं । इसमें यह भी उल्लेख किया गया है कि कौन से पैटर्न का उल्लेख गोएफ द्वारा किया गया है। मैं उन्हें यहाँ जोड़ूंगा और जावा एसई और जावा ईई एपीआई दोनों में पाया जा सकता है कि जितना संभव हो उतना पैटर्न कार्यान्वयन को लागू करने का प्रयास करें।


रचनात्मक पैटर्न

सार कारखाना (रचनात्‍मक तरीकों से पहचाने जाने योग्य कारखाना जो खुद बदले में एक और सार / इंटरफ़ेस प्रकार बनाने के लिए उपयोग किया जा सकता है)

बिल्डर (खुद को वापस लौटाने वाले रचनात्मक तरीकों से पहचानने योग्य)

फैक्टरी विधि (एक अमूर्त / इंटरफ़ेस प्रकार के कार्यान्वयन को लौटाने वाली रचनात्मक विधियों द्वारा पहचाने जाने योग्य)

प्रोटोटाइप (एक ही गुण के साथ स्वयं का एक अलग उदाहरण लौटाने वाली रचनात्मक विधियों द्वारा पहचाने जाने योग्य )

सिंगलटन ( समान रूप से स्वयं को लौटाने वाली रचनात्मक विधियों द्वारा पहचाने जाने योग्य )


संरचनात्मक पैटर्न

एडेप्टर ( विभिन्न अमूर्त / इंटरफ़ेस प्रकार का एक उदाहरण लेने के लिए रचनात्मक तरीकों से पहचाने जाने योग्य और स्वयं के / अन्य अमूर्त / इंटरफ़ेस प्रकार के कार्यान्वयन को वापस करता है जो दिए गए उदाहरण को सजाता / ओवरराइड करता है)

ब्रिज ( विभिन्न अमूर्त / इंटरफ़ेस प्रकार का एक उदाहरण लेने के लिए रचनात्मक तरीकों से पहचाने जाने योग्य और स्वयं के सार / इंटरफ़ेस प्रकार के कार्यान्वयन को वापस करता है जो दिए गए उदाहरण को दर्शाता / उपयोग करता है)

  • किसी के मन में अभी तक नहीं आया। एक काल्पनिक उदाहरण वह होगा new LinkedHashMap(LinkedHashSet<K>, List<V>)जो एक अनमॉडिफ़ाइड लिंक्ड मैप को लौटाता है जो आइटमों को क्लोन नहीं करता है, लेकिन उनका उपयोग करता है। java.util.Collections#newSetFromMap()और singletonXXX()तरीकों हालांकि करीब आता है।

समग्र ( एक पेड़ की संरचना में एक ही सार / इंटरफ़ेस प्रकार का उदाहरण लेते हुए व्यवहार के तरीकों से पहचाने जाने योग्य )

डेकोरेटर (एक ही अमूर्त / इंटरफ़ेस प्रकार जो अतिरिक्त व्यवहार को जोड़ता है) का उदाहरण लेते हुए रचनात्मक तरीकों से पहचाने जाने योग्य

मुखौटा (व्यवहार के तरीकों से पहचाने जाने योग्य जो आंतरिक रूप से विभिन्न स्वतंत्र अमूर्त / इंटरफ़ेस प्रकारों के उदाहरणों का उपयोग करता है )

फ्लाईवेट (एक कैश्ड उदाहरण लौटाते हुए रचनात्मक तरीकों से पहचाने जाने योग्य, "मल्टीटन" विचार)

प्रॉक्सी (सृजनात्मक विधियों द्वारा पहचाने जाने योग्य है जो दिए गए अमूर्त / इंटरफ़ेस प्रकार के कार्यान्वयन को लौटाता है जो बदले में दिए गए सार / इंटरफ़ेस प्रकार के एक अलग कार्यान्वयन को दर्शाता है / उपयोग करता है )


स्वभावजन्य तरीका

जिम्मेदारी की चेन (व्यवहार तरीकों (परोक्ष रूप से) में एक ही विधि का आह्वान द्वारा recognizeable एक और के कार्यान्वयन के एक ही एक कतार में सार / इंटरफ़ेस प्रकार)

कमांड (एक अमूर्त / इंटरफ़ेस प्रकार में व्यवहार विधियों द्वारा पहचाने जाने योग्य) जो भिन्न सार / इंटरफ़ेस प्रकार के कार्यान्वयन में एक विधि को लागू करता है जो कि किया गया है करता है जिसे इसके निर्माण के दौरान कमांड कार्यान्वयन द्वारा समझाया गया है)

दुभाषिया (क लौटने व्यवहार तरीकों से recognizeable संरचना की दृष्टि से विभिन्न उदाहरण / दिए गए उदाहरण / प्रकार के प्रकार, ध्यान दें कि पार्स / स्वरूपण, पैटर्न का हिस्सा नहीं है पैटर्न को निर्धारित करने और कैसे यह है लागू करने के लिए)

Iterator (व्यवहार विधियों द्वारा पहचाने जाने योग्य क्रमिक रूप से एक कतार से भिन्न प्रकार के इंस्टेंस को लौटाता है )

मध्यस्थ (अलग-अलग सार / इंटरफ़ेस प्रकार का उपयोग करके व्यवहार विधियों द्वारा पहचाने जाने योग्य (आमतौर पर कमांड पैटर्न का उपयोग करके) जो दिए गए उदाहरण को दर्शाता / उपयोग करता है)

मेमेंटो (व्यवहार के तरीकों से पहचाने जाने योग्य है जो आंतरिक रूप से पूरे उदाहरण की स्थिति को बदल देता है )

  • java.util.Date(सेटर विधियां ऐसा करती हैं, जिसे Dateआंतरिक रूप से एक longमूल्य द्वारा दर्शाया जाता है )
  • के सभी कार्यान्वयन java.io.Serializable
  • के सभी कार्यान्वयन javax.faces.component.StateHolder

ऑब्जर्वर (या प्रकाशित / सदस्यता लें) (व्यवहार के तरीकों से पहचाने जाने योग्य जो किसी अन्य अमूर्त / इंटरफ़ेस प्रकार के उदाहरण पर एक विधि को लागू करता है, जो अपने राज्य पर निर्भर करता है)

राज्य (व्यवहार के तरीकों से पहचाने जाने योग्य है जो उसके व्यवहार को उस स्थिति के आधार पर बदलता है जिसे बाहरी रूप से नियंत्रित किया जा सकता है)

रणनीति (एक अमूर्त / इंटरफ़ेस प्रकार में व्यवहार के तरीकों से पहचाने जाने योग्य जो एक अलग सार / इंटरफ़ेस प्रकार के कार्यान्वयन में एक विधि को लागू करती है जिसे पारित किया गया है - रणनीति कार्यान्वयन में विधि तर्क के रूप में)

  • java.util.Comparator#compare(), दूसरों के बीच द्वारा निष्पादित Collections#sort()
  • javax.servlet.http.HttpServlet, service()और सभी doXXX()विधियों को लेते हैं HttpServletRequestऔर HttpServletResponseकार्यान्वयनकर्ता को उन्हें संसाधित करना पड़ता है (और उदाहरण के चर के रूप में उन्हें पकड़ना नहीं है!)।
  • javax.servlet.Filter#doFilter()

टेम्प्लेट विधि (व्यवहार विधियों द्वारा पहचाने जाने योग्य जो पहले से ही एक अमूर्त प्रकार द्वारा परिभाषित "डिफ़ॉल्ट" व्यवहार है)

विज़िटर (दो अलग-अलग सार / इंटरफ़ेस प्रकारों द्वारा पहचाने जाने योग्य, जिसमें परिभाषित की गई विधियाँ हैं जो एक- दूसरे को सार / इंटरफ़ेस प्रकार को लेते हैं, वास्तव में दूसरे की विधि को कहते हैं और दूसरा उस पर वांछित रणनीति को निष्पादित करता है)


23
प्रभावशाली .. :) +1। javax.lang.model.elementआगंतुकों को परिभाषित करता है;) मैं काफी यकीन नहीं है कि नहीं कर रहा हूँ doXXXऔर doFilter"रणनीति" कर रहे हैं।
Bozho

16
उल्लिखित बिल्डरों जैसे स्ट्रिनबगबर्स्ट सभी बिल्डर-पैटर्न के लिए एक उदाहरण नहीं हैं। हालाँकि बिल्डरों के रूप में उन पर विचार करना एक बहुत ही सामान्य गलती है (इसलिए आप वास्तव में ^ _ ^ को दोष नहीं दे रहे हैं)
एंजेल ओ'स्फेयर

77
@BalusC, मेरा आपसे एक सवाल है। आपने जावा और जेएसएफ का WHOLE स्रोत कोड पढ़ा है ?
तापस बोस

20
@ तपस: मैंने सब कुछ नहीं पढ़ा, केवल उन हिस्सों को जिनकी मुझे ज़रूरत थी, या बस उत्सुक थे कि कैसे "उन्होंने" किया।
बालुस

7
"फ़ैक्टरी विधि" के अंतर्गत अधिकांश उदाहरण "स्टैटिक फ़ैक्टरी" के उदाहरण हैं, जो एक गोफ़ पैटर्न नहीं है। गलत।
रिंग बियरर

107
  1. पूरे जोरों पर पर्यवेक्षक पैटर्न ( Observable, Observer)
  2. MVC भी स्विंग में
  3. एडाप्टर पैटर्न: InputStreamReader और OutputStreamWriter नोट: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapterकर रहे हैं नहीं एडेप्टर; वे वास्तव में अशक्त वस्तुएं हैं। सूर्य द्वारा खराब नामकरण पसंद।
  4. डेकोरेटर पैटर्न ( BufferedInputStreamजैसे अन्य धाराओं को सजा सकते हैं FilterInputStream)
  5. AWT टूलकिट और स्विंग प्‍लग्‍गेबल लुक-एंड-फील क्‍लासेज के लिए एब्स्ट्रैक्ट पैटर्न
  6. java.lang.Runtime#getRuntime() सिंगलटन है
  7. ButtonGroup मध्यस्थ पैटर्न के लिए
  8. Action, AbstractAction एक ही कोड -> कमांड पैटर्न को निष्पादित करने के लिए विभिन्न दृश्य प्रतिनिधित्व के लिए उपयोग किया जा सकता है
  9. फ्लाइटवेट पैटर्न के लिए जेटेबल में इंटर्नल स्ट्रिंग्स या सेलरेंडर (विभिन्न पूलों के बारे में भी सोचें - थ्रेड पूल, कनेक्शन पूल, ईजेबी ऑब्जेक्ट पूल - फ्लाईवेट वास्तव में साझा संसाधनों के प्रबंधन के बारे में है)
  10. जावा 1.0 ईवेंट मॉडल चेन ऑफ रिस्पॉन्सिबिलिटी का एक उदाहरण है, जैसा कि सर्वलेट फिल्टर हैं।
  11. कलेक्शंस फ्रेमवर्क में इटरेटर पैटर्न
  12. AWT / स्विंग में नेस्टेड कंटेनर कम्पोजिट पैटर्न का उपयोग करते हैं
  13. AWT / स्विंग में लेआउट प्रबंधक रणनीति का एक उदाहरण है

और कई और मुझे लगता है


1
माउस एडेप्टर पर टिप के लिए धन्यवाद। मुझे यह अतिशयोक्ति मिली: stackoverflow.com/questions/9244185/…
लिंकन

ध्यान दें कि स्विंग केवल MVC पर आधारित है। इसने व्यू और कंट्रोलर को एक वर्ग में विभाजित कर दिया है।
मथायस ब्रौन

51
  1. फ्लाईवेट का उपयोग बाइट, शॉर्ट, इंटेगर, लॉन्ग और स्ट्रिंग के कुछ मूल्यों के साथ किया जाता है।
  2. मुखौटा का उपयोग कई स्थानों पर किया जाता है लेकिन सबसे स्पष्ट स्क्रिप्टिंग इंटरफेस है।
  3. एकाकी वस्तु - java.lang.Runtime का ख्याल आता है।
  4. सार कारखाना - इसके अलावा स्क्रिप्टिंग और जेडीबीसी एपीआई।
  5. आदेश - TextComponent के पूर्ववत करें / फिर से करें।
  6. दुभाषिया - RegEx (java.util.regex। ) और SQL (java.sql)। ) एपीआई।
  7. प्रोटोटाइप - यदि यह गिनती है तो 100% निश्चित नहीं है, लेकिन मुझे लगता clone()है कि इस उद्देश्य के लिए विधि का उपयोग किया जा सकता है।

1
फ्लाईवेट पैटर्न के बारे में : यह विभिन्न लेआउट मैनेजरों से java.awtऔर java.swingपैकेज हो सकता है। वास्तव में, वे लगभग समान आंतरिक विशेषताओं को साझा करते हैं और बाहरी विशेषता अलग-अलग यूआई घटक हैं जो वे यूआई के रूप में रखते हैं।
विटाली

@NawaMan आपने कहा है 5. कॉमन टेक्स्टकम्पोनेंट के पूर्ववत करें / फिर से करें। मुझे लगता है कि यह यादगार है कमान नहीं। या सबसे शायद दोनों।
स्टिम्पसन कैट

क्या आप कृपया मुझे एक संबंधित प्रश्न में मदद कर सकते हैं - stackoverflow.com/questions/61284856/… । मैंने इस सरल उदाहरण में कमांड पैटर्न का उपयोग किया, लेकिन मुझे यकीन नहीं है कि यह मेरी समस्या को हल करने का सही तरीका है।
टॉम जो

42

RMI प्रॉक्सी पर आधारित है।

गोफ में 23 पैटर्न में से अधिकांश के लिए एक का हवाला देना संभव होना चाहिए:

  1. सार फैक्टरी: java.sql इंटरफेस सभी को JDBC JAR से अपना ठोस कार्यान्वयन प्राप्त होता है जब ड्राइवर पंजीकृत होता है।
  2. बिल्डर: java.lang.StringBuilder।
  3. फैक्टरी विधि: XML कारखानों, दूसरों के बीच में।
  4. प्रोटोटाइप: हो सकता है कि क्लोन (), लेकिन मुझे यकीन नहीं है कि मैं इसे खरीद रहा हूं।
  5. सिंगलटन: java.lang.System
  6. अडैप्टर: java.awt.event, उदाहरण के लिए, WindowAdapter में एडेप्टर कक्षाएं।
  7. ब्रिज: java.util में संग्रह कक्षाएं। ArrayList द्वारा कार्यान्वित सूची।
  8. समग्र: java.awt। java.awt.Component + java.awt.Container
  9. डेकोरेटर: सभी java.io पैकेज पर।
  10. मुखौटा: एक्सटर्नलकोटेक्स कुकी, सत्र गुंजाइश और इसी तरह के संचालन के लिए एक मुखौटा के रूप में व्यवहार करता है।
  11. फ्लाईवेट: पूर्णांक, चरित्र, आदि।
  12. प्रॉक्सी: java.rmi पैकेज
  13. जिम्मेदारी की श्रृंखला: सर्वलेट फिल्टर
  14. कमांड: स्विंग मेनू आइटम
  15. दुभाषिया: सीधे JDK में नहीं, लेकिन JavaCC निश्चित रूप से इसका उपयोग करता है।
  16. Iterator: java.util.Iterator इंटरफ़ेस; उससे अधिक स्पष्ट नहीं हो सकता।
  17. मध्यस्थ: जेएमएस?
  18. स्मृति चिन्ह:
  19. प्रेक्षक: java.util.Observer/Observable (बुरी तरह से किया हुआ, हालाँकि)
  20. राज्य:
  21. रणनीति:
  22. टेम्पलेट:
  23. आगंतुक:

मैं जावा में 23 में से 10 के लिए उदाहरणों के बारे में नहीं सोच सकता, लेकिन मैं देखूंगा कि क्या मैं कल बेहतर कर सकता हूं। यही संपादित करने के लिए है।


28

विभिन्न स्थानों में एब्सट्रैक्ट फ़ैक्टरी पैटर्न का उपयोग किया जाता है। उदाहरण के लिए, , ।DatagramSocketImplFactory PreferencesFactoryकई और भी हैं --- इंटरफेस के लिए जावदोक खोजें जिनके नाम में "फैक्टरी" शब्द है।

फैक्ट्री पैटर्न के भी कुछ उदाहरण हैं।


22

भले ही मैं इस एक के साथ एक टूटी हुई घड़ी की तरह हूँ, जावा एक्सएमएल एपीआई फैक्टरी का बहुत उपयोग करता है। मेरा मतलब है कि बस इसे देखो:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...इत्यादि इत्यादि।

इसके अतिरिक्त विभिन्न बफ़र (StringBuffer, ByteBuffer, StringBuilder) बिल्डर का उपयोग करते हैं।


21

java.util.Collection # Iterator फैक्ट्री मेथड का एक अच्छा उदाहरण है। आपके द्वारा उपयोग किए जाने वाले संग्रह के ठोस उपवर्ग के आधार पर, यह एक इटरेटर कार्यान्वयन बना देगा। क्योंकि फैक्ट्री सुपरक्लास (कलेक्शन) और आईटरेटर दोनों ही इंटरफेस हैं, यह कभी-कभी एब्सट्रैक्ट के साथ भ्रमित होता है। स्वीकृत उत्तर (BalusC) में AbstractFactory के लिए अधिकांश उदाहरण फ़ैक्टरी के उदाहरण हैं , फ़ैक्टरी विधि का एक सरलीकृत संस्करण, जो मूल GoF पैटर्न का हिस्सा नहीं है। फेसरी में फैक्ट्री वर्ग पदानुक्रम ढह गया है और उत्पाद वापस करने के लिए उत्पाद का चयन करने के लिए कारखाने अन्य साधनों का उपयोग करते हैं।

  • सार कारखाना

एक अमूर्त कारखाने में कई कारखाने विधियां हैं, प्रत्येक एक अलग उत्पाद बनाती है। एक कारखाने द्वारा उत्पादित उत्पादों को एक साथ उपयोग करने का इरादा है (आपके प्रिंटर और कारतूस एक ही (अमूर्त) कारखाने से बेहतर होंगे)। जैसा कि AWT GUI घटकों के परिवारों के ऊपर के उत्तर में उल्लेख किया गया है, मंच से मंच तक भिन्न, इसका एक उदाहरण है (हालांकि इसका कार्यान्वयन गोफ में वर्णित संरचना से भिन्न है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.