java जावा के मूल पुस्तकालयों में गोफ डिजाइन पैटर्न के उदाहरण




oop design-patterns (6)

आरएमआई प्रॉक्सी पर आधारित है।

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

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

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

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


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

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

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

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

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

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

Singleton (हर समय एक ही उदाहरण (आमतौर पर स्वयं) लौटने वाली रचनात्मक विधियों द्वारा पहचाना जा सकता है)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • java.io.InputStream सभी गैर-अमूर्त तरीकों, OutputStream , Reader और Writer
  • java.util.AbstractList , java.util.AbstractSet और java.util.AbstractMap सभी गैर-अमूर्त तरीकों।
  • javax.servlet.http.HttpServlet , डिफ़ॉल्ट रूप से सभी doXXX() विधियां प्रतिक्रिया में HTTP 405 "विधि अनुमत नहीं है" त्रुटि भेजती हैं। आप किसी भी या उनमें से किसी को लागू करने के लिए स्वतंत्र नहीं हैं।

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


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

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


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

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

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


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

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

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

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







java-api