Overview of Design Patterns in Java

जावा डिज़ाइन पैटर्न ट्यूटोरियल।

एक डिज़ाइन पैटर्न एक सामान्य सॉफ़्टवेयर समस्या का एक सुस्थापित और प्रलेखित समाधान है। आप इन्हें जानकार और अनुभवी सॉफ़्टवेयर डेवलपर्स द्वारा उपयोग की जाने वाली सर्वोत्तम प्रथाओं के रूप में सोच सकते हैं। जावा के पहली बार प्रस्तुत होने के बाद से एक चौथाई सदी में, सॉफ्टवेयर डेवलपर्स को सॉफ्टवेयर विकास के दौरान कई सामान्य समस्याओं का सामना करना पड़ा है। समय के साथ, सबसे लाभप्रद समाधान परीक्षण और त्रुटि के माध्यम से प्राप्त किए गए, साथ ही कई विचारों और दृष्टिकोणों को शामिल करते हुए बहुत सारे प्रयोग किए गए। इन समाधानों को अब मान्यता प्राप्त डिज़ाइन पैटर्न के एक सेट में संहिताबद्ध किया गया है। पेशेवर सॉफ़्टवेयर डेवलपर्स से अपेक्षा की जाती है कि वे विशिष्ट कोडिंग समस्याओं के कम से कम कुछ लोकप्रिय समाधान जानें। इसे ध्यान में रखते हुए, यह श्रृंखला डिज़ाइन पैटर्न का उपयोग करने के कुछ मुख्य लाभों को प्रस्तुत करेगी, विभिन्न प्रकार के डिज़ाइन पैटर्न की सूची बनाएगी और अंत में, प्रत्येक श्रेणी के लिए पैटर्न का एक संक्षिप्त सारांश प्रदान करेगी।

करने के लिए कूद:

जावा डिज़ाइन पैटर्न के लाभ

चूंकि प्रत्येक एप्लिकेशन अलग है, एक स्थापित डिज़ाइन पैटर्न का पालन करना आपकी विशिष्ट चुनौती के पूर्ण समाधान की गारंटी नहीं देता है। हालाँकि, डिज़ाइन पैटर्न इसे अकेले आज़माने की तुलना में कई लाभ प्रदान करते हैं। यहां महज कुछ हैं:

  • डिज़ाइन पैटर्न परीक्षणित, सिद्ध विकास प्रतिमान प्रदान करके विकास प्रक्रिया को गति दे सकते हैं।
  • वे पुन: प्रयोज्यता को बढ़ावा देते हैं और कई परियोजनाओं में लागू किया जा सकता है।
  • वे सिस्टम आर्किटेक्चर को परिभाषित करने में मदद करते हैं।
  • वे किसी एप्लिकेशन के डिज़ाइन में पारदर्शिता प्रदान करने में सहायता करते हैं।
  • डिज़ाइन पैटर्न का उपयोग करने से अधिक मजबूत और उच्च रखरखाव योग्य कोड प्राप्त होता है।
  • कोड को समझना और डीबग करना आसान बनाता है।

देखना: टीआर अकादमी से शीर्ष जावा पाठ्यक्रम

डिज़ाइन पैटर्न के प्रकार

डिज़ाइन पैटर्न पर आधिकारिक संदर्भ पुस्तक “डिज़ाइन पैटर्न – पुन: प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर के तत्व” है। यह 23 डिज़ाइन पैटर्न की रूपरेखा प्रस्तुत करता है, जिन्हें तीन श्रेणियों में विभाजित किया गया है: क्रिएशनल, संरचनात्मकऔर व्यवहार पैटर्न. हम इस श्रृंखला में कुछ विविध डिज़ाइन पैटर्न पर भी चर्चा करेंगे। यहां प्रत्येक श्रेणी पर अधिक जानकारी दी गई है:

  1. सृजनात्मक पैटर्न: ये डिज़ाइन पैटर्न ऑब्जेक्ट को सीधे उपयोग करने के बजाय निर्माण तर्क को छिपाते हुए ऑब्जेक्ट बनाने का एक तरीका प्रदान करते हैं नया ऑपरेटर। इससे प्रोग्रामर को यह निर्णय लेने में अधिक लचीलापन मिलता है कि किसी दिए गए उपयोग के मामले के लिए कौन सी वस्तुओं को बनाने की आवश्यकता है।
  2. संरचनात्मक पैटर्न: ये डिज़ाइन पैटर्न वर्ग और वस्तु संरचना से संबंधित हैं। इनहेरिटेंस की अवधारणा का उपयोग इंटरफेस बनाने और नई कार्यक्षमता प्राप्त करने के लिए ऑब्जेक्ट बनाने के तरीकों को परिभाषित करने के लिए किया जाता है।
  3. स्वभावजन्य तरीका: ये डिज़ाइन पैटर्न वस्तुओं के बीच संचार को संबोधित करते हैं।
  4. विविध पैटर्न: ये डिज़ाइन पैटर्न सन जावा सेंटर द्वारा पहचाने जाते हैं और अधिकतर प्रेजेंटेशन स्तर से संबंधित होते हैं।

इस प्रोग्रामिंग ट्यूटोरियल का शेष भाग रचनात्मक पैटर्न का अवलोकन प्रदान करेगा; अन्य पैटर्न बाद में यहां जोड़े जाएंगे।

सृजनात्मक पैटर्न

सृजनात्मक डिज़ाइन पैटर्न त्वरित करने के लिए समाधान प्रदान करते हैं वस्तु किसी भी स्थिति के लिए सर्वोत्तम संभव तरीके से। “डिज़ाइन पैटर्न” पुस्तक पाँच रचनात्मक डिज़ाइन पैटर्न का वर्णन करती है:

  1. फ़ैक्टरी पैटर्न.
  2. सार फ़ैक्टरी पैटर्न।
  3. सिंगलटन पैटर्न.
  4. प्रोटोटाइप पैटर्न.
  5. बिल्डर पैटर्न.

अब, आइए इनमें से प्रत्येक के बारे में अधिक विस्तार से जानें।

फ़ैक्टरी पैटर्न

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

उदाहरण के लिए, हम कुछ ठोस वर्ग बना सकते हैं जो इसे लागू करते हैं आकार इंटरफेस। तब कक्षाएँ इसका उपयोग करेंगी शेपफैक्ट्री एक पाने के लिए कक्षा आकार वस्तु, उस वस्तु के प्रकार के बारे में जानकारी देना जिसकी उसे आवश्यकता है (अर्थात् घेरा, आयत, वर्ग, वगैरह।)। फ़ैक्टरी वर्ग एक का उपयोग करता है यदि नहीं तो या बदलना यह तय करने के लिए कि किस वर्ग को वापस लौटना है, कथन:

public class ShapeFactory {
	
   // get object of type shape 
   // based on ShapeType enum
   public Shape getShape(ShapeType shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType == ShapeType.CIRCLE){
         return new Circle();
         
      } else if(shapeType == ShapeType.RECTANGLE){
         return new Rectangle();
         
      } else if(shapeType == ShapeType.SQUARE){
         return new Square();
      }
      
      return null;
   }
}

सार फ़ैक्टरी पैटर्न

एब्सट्रैक्ट फ़ैक्टरी पैटर्न फ़ैक्टरियों की फ़ैक्टरी प्रदान करके फ़ैक्टरी पैटर्न को एक पायदान ऊपर ले जाता है। फ़ैक्टरी डिज़ाइन पैटर्न में, आपके पास आमतौर पर एक फ़ैक्टरी क्लास होगी जो दिए गए इनपुट के आधार पर विभिन्न उपवर्ग लौटाती है।

हालाँकि, एब्सट्रैक्ट फ़ैक्टरी पैटर्न में यदि नहीं तो उपरोक्त उदाहरण के ब्लॉक को कई फ़ैक्टरी कक्षाओं (प्रत्येक उपवर्ग के लिए एक) द्वारा प्रतिस्थापित किया जाएगा। एक अमूर्त फ़ैक्टरी वर्ग फिर इनपुट फ़ैक्टरी वर्ग के आधार पर उपवर्ग लौटाता है।

सिंगलटन पैटर्न

सिंगलटन पैटर्न ए की तात्कालिकता को प्रतिबंधित करता है कक्षा और यह सुनिश्चित करता है कि जावा वर्चुअल मशीन (JVM) में क्लास का केवल एक उदाहरण मौजूद है। सिंगलटन पैटर्न का कार्यान्वयन हमेशा डेवलपर्स के बीच एक विवादास्पद विषय रहा है। मुख्य बात यह है कि सिंगलटन किसी एप्लिकेशन के जीवन भर मेमोरी में बने रहते हैं, जिससे वे सिस्टम संसाधनों पर संभावित खर्च करते हैं। दूसरी ओर, स्मृति में एक वस्तु का होना एक साथ मौजूद कई उदाहरणों की तुलना में बेहतर है।

प्रोटोटाइप पैटर्न

प्रोटोटाइप पैटर्न का उपयोग तब किया जाता है जब वस्तु निर्माण महंगा है और इसके लिए बहुत अधिक समय और संसाधनों की आवश्यकता होती है, और आपके पास भी ऐसा ही है वस्तु वह पहले से ही त्वरित है. प्रोटोटाइप पैटर्न का उपयोग करके, प्रोग्रामर मूल की नकल करेंगे वस्तु एक नए के लिए वस्तु और फिर इसे अपनी आवश्यकताओं के अनुसार संशोधित करें। की नकल वस्तु का जावा क्लोनिंग का उपयोग करके गुण प्राप्त किए जाते हैं। प्रोटोटाइप डिज़ाइन पैटर्न यह अनिवार्य करता है कि वस्तु जिसे आप कॉपी कर रहे हैं उसे कॉपी करने की सुविधा प्रदान करनी चाहिए। ऐसा किसी अन्य वर्ग द्वारा नहीं किया जाना चाहिए। हालाँकि, ऑब्जेक्ट गुणों की उथली या गहरी प्रतिलिपि का उपयोग करना आवश्यकताओं पर निर्भर करता है और यह एक डिज़ाइन निर्णय है।

बिल्डर पैटर्न

बिल्डर पैटर्न को फ़ैक्टरी और एब्सट्रैक्ट फ़ैक्टरी डिज़ाइन पैटर्न के साथ कुछ समस्याओं को हल करने के लिए पेश किया गया था जब ऑब्जेक्ट में बहुत सारी विशेषताएँ होती हैं। यह पैटर्न बड़ी संख्या में वैकल्पिक पैरामीटर पेश करके समस्या का समाधान करता है। वस्तु असंगत स्थिति में भी हो सकती है और इसे चरण-दर-चरण बनाया जा सकता है। अंत में, बिल्डर वर्ग एक विधि प्रदान करता है जो वास्तव में फाइनल लौटाएगा वस्तु.

संरचनात्मक डिज़ाइन पैटर्न

सात संरचनात्मक डिज़ाइन पैटर्न इस प्रकार हैं:

  • एडाप्टर पैटर्न
  • ब्रिज पैटर्न
  • समग्र पैटर्न
  • डेकोरेटर पैटर्न
  • अग्रभाग पैटर्न
  • फ्लाईवेट पैटर्न
  • प्रॉक्सी पैटर्न

अगला भाग एडॉप्टर और ब्रिज पैटर्न के बारे में अधिक विस्तार से जानेगा।

एडाप्टर पैटर्न

रैपर पैटर्न के रूप में भी जाना जाता है, एडेप्टर पैटर्न असंगत इंटरफेस वाली वस्तुओं को सहयोग करने की अनुमति देता है। इसका नाम उस ऑब्जेक्ट के नाम पर रखा गया है जो इन असंबंधित इंटरफेस से जुड़ता है, जिसे a कहा जाता है अनुकूलक. एडॉप्टर ऑब्जेक्ट एक ऑब्जेक्ट के लिए कॉल लेता है और उन्हें दूसरे ऑब्जेक्ट द्वारा पहचाने जाने योग्य प्रारूप और इंटरफ़ेस में बदल देता है।

एडॉप्टर पैटर्न में चार भाग होते हैं:

  • लक्ष्य इंटरफ़ेस: यह वांछित इंटरफ़ेस वर्ग है जिसका उपयोग ग्राहकों द्वारा किया जाएगा।
  • एडाप्टर वर्ग: यह क्लास एक रैपर क्लास है जो वांछित लक्ष्य इंटरफ़ेस को लागू करता है और एडाप्टी क्लास से उपलब्ध विशिष्ट अनुरोध को संशोधित करता है।
  • अनुकूली वर्ग: यह वह वर्ग है जिसका उपयोग एडाप्टर वर्ग द्वारा मौजूदा कार्यक्षमता का पुन: उपयोग करने और वांछित उपयोग के लिए उन्हें संशोधित करने के लिए किया जाता है।
  • ग्राहक: यह क्लास एडॉप्टर क्लास के साथ इंटरैक्ट करेगी।

उदाहरण के तौर पर, मान लें कि हमारे पास एक वाहन इंटरफ़ेस जो एक ऐसी विधि को परिभाषित करता है जो इसकी शीर्ष गति लौटाती है:

package com.techrepublic;

public interface Vehicle {
  //other methods...
  
  double getTopSpeed();
  
  //other methods...
}

वाहन उम्मीद है कि कक्षाओं में शीर्ष गति वापस आ जाएगी मील प्रति घंटा (एमपीएच) जैसा कि यह करता है:

package com.techrepublic;

public class Infiniti implements Vehicle {

  @Override
  public double getTopSpeed() {
    // in MPH (Miles Per Hour)
    return 150;
  }
}

हम किसी वाहन की अधिकतम गति लौटाने के लिए एडाप्टर पैटर्न का उपयोग कर सकते हैं किलोमीटर प्रति घंटा (KPH).

ऐसा करने के लिए, हम पहले एक एडाप्टर इंटरफ़ेस बनाएंगे जो उन तरीकों को परिभाषित करता है जिनमें हम रुचि रखते हैं:

package com.techrepublic;

public interface VehicleAdapter {
  double getTopSpeed();
}

अनुकूली वर्ग हमारा कार्यान्वयन करेगा वाहन एडाप्टर इंटरफ़ेस और ओवरराइड करें गेटटॉपस्पीड() वापस लौटने की विधि किलोमीटर प्रति घंटा इसके बजाय मील प्रति घंटे:

package com.techrepublic;

public class VehicleAdapterImpl implements VehicleAdapter {
  private Vehicle canadianVehicle;
  
  public VehicleAdapterImpl(Vehicle canadianVehicle) {
    super();
    this.canadianVehicle = canadianVehicle;
  }
  
  @Override
  public double getTopSpeed() {
    return convertMPHtoKMPH(canadianVehicle.getTopSpeed());
  }
  
  private double convertMPHtoKMPH(double mph) {
    return mph * 1.60934;
  }
}

असली जादू हमारे मुख्य एप्लिकेशन क्लास में होता है जहां अब हम अपने लिए एक वाहन पास कर सकते हैं वाहन एडाप्टरImpl कंस्ट्रक्टर, जिसका उपयोग अब हम शीर्ष गति को परिवर्तित करने के लिए कर सकते हैं मील प्रति घंटे को किलोमीटर प्रति घंटा:

package com.techrepublic;

public class AdapterPatternDemo {

  public static void main(String[] args) {
    Infiniti canadianInfiniti = new Infiniti();
    VehicleAdapter adapter = new VehicleAdapterImpl(canadianInfiniti);
    
    System.out.println("Top speed in KPH: " + adapter.getTopSpeed());
  }
}

यहां प्रोग्राम आउटपुट है जो शीर्ष गति दिखाता है केपीएम:

Top speed in KPH: 241.401

हम निम्नलिखित यूएमएल आरेख में देख सकते हैं कि एडाप्टर पैटर्न के अनुसार विभिन्न वस्तुएं एक साथ कैसे फिट होती हैं:

जावा एडाप्टर डिज़ाइन पैटर्न।

ब्रिज पैटर्न

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

ब्रिज डिज़ाइन पैटर्न के तत्वों में शामिल हैं:

  • मतिहीनता: ब्रिज डिज़ाइन पैटर्न का मूल, यह एक अमूर्त वर्ग है जिसमें कार्यान्वयनकर्ता का संदर्भ होता है।
  • परिष्कृत अमूर्तन: अमूर्तन को विस्तारित करके बारीक विवरण को एक स्तर नीचे ले जाता है। कार्यान्वयनकर्ताओं से बारीक तत्वों को छुपाता है।
  • कार्यान्वयनकर्ता: यह कार्यान्वयन कक्षाओं के लिए इंटरफ़ेस को परिभाषित करता है। ध्यान दें कि इस इंटरफ़ेस को सीधे एब्स्ट्रैक्शन इंटरफ़ेस से मेल खाने की आवश्यकता नहीं है।
  • ठोस कार्यान्वयन: उपरोक्त कार्यान्वयनकर्ता को ठोस कार्यान्वयन विधियाँ प्रदान करके कार्यान्वित करता है।

ब्रिज पैटर्न को स्पष्ट करने के लिए, आइए कल्पना करें कि हमारे पास एक कारखाना है जो विभिन्न प्रकार के वाहनों का उत्पादन और संयोजन करता है। कहावत “विरासत से अधिक संरचना को प्राथमिकता दें” याद रखना अच्छा है जब आपको किसी वस्तु को उन तरीकों से उपवर्गित करना होता है जो एक दूसरे से भिन्न होते हैं।

यहां एक यूएमएल आरेख है जो दर्शाता है कि ब्रिज पैटर्न के बिना कारखाने का संचालन कैसा दिख सकता है:

वाहन असेंबली कोड उदाहरण.

यह तब तक ठीक काम करता है, जब तक आपको किसी कक्षा में परिवर्तन करने की आवश्यकता न हो। उदाहरण के लिए, रीफैक्टरिंग कार कक्षा को बदलने की भी आवश्यकता हो सकती है उत्पादनकार और कार को इकट्ठा करो. इसके अलावा, यदि परिवर्तन फ़ैक्टरी विशिष्ट हैं, तो आपको अन्य कक्षाओं को भी बदलने की आवश्यकता हो सकती है।

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

जावा ब्रिज डिज़ाइन पैटर्न।

पैटर्न का मूल सार है वाहन कक्षा; यह फ़ैक्टरियों पर नज़र रखता है और उनके लिए हस्ताक्षर परिभाषित करता है निर्माण() तरीका:

package com.techrepublic;

abstract class Vehicle {
  protected Factory factory1;
  protected Factory factory2;
  
  protected Vehicle(Factory factory1, Factory factory2) {
    this.factory1 = factory1;
    this.factory2 = factory2;
  }
  
  abstract public void manufacture();
}

अगला कदम परिष्कृत करना है वाहन ठोस वर्गों में अमूर्तन। हम एक परिभाषित करेंगे कार और ट्रक:

package com.techrepublic;

public class Car extends Vehicle {
	
  public Car(Factory factory1, Factory factory2) {
    super(factory1, factory2);
  }
  
  @Override
  public void manufacture() {
    System.out.print("Car ");
    factory1.work();
    factory2.work();
  }
}
package com.techrepublic;

public class Truck extends Vehicle {

  protected Truck(Factory factory1, Factory factory2) {
    super(factory1, factory2);
  }
  
  @Override
  public void manufacture() {
    System.out.print("Truck ");
    factory1.work();
    factory2.work();
  }
}

अब ब्रिज पैटर्न के लिए कार्यान्वयनकर्ता को जोड़ने का समय आ गया है। हमारे मामले में, यह एक है फ़ैक्टरी के लिए इंटरफ़ेस तरीके:

package com.techrepublic;

public interface Factory {
  abstract public void work();
}


अब उत्पादन और असेंबली प्रक्रिया के प्रत्येक चरण को कार्यान्वित किया जा सकता है कारखाना वे जिस भी चरण के लिए जिम्मेदार हैं उसे निष्पादित करने के लिए इंटरफ़ेस:

package com.techrepublic;

public class Produce implements Factory {

  @Override
  public void work() {
    System.out.print("Produced");
  }
}
package com.techrepublic;

public class Assemble implements Factory {

  @Override
  public void work() {
    System.out.print("...and assembled.\n");
  }
}

यहां एप्लिकेशन क्लास है जो सब कुछ एक साथ जोड़ती है:

package com.techrepublic;

public class BridgePatternDemo {

  public static void main(String[] args) {
    Vehicle car = new Car(new Produce(), new Assemble());
    car.manufacture();
    Vehicle truck = new Truck(new Produce(), new Assemble());
    truck.manufacture();
  }
}

प्रोग्राम चलाने से निम्नलिखित आउटपुट उत्पन्न होता है:

Car Produced...and assembled.
Truck Produced...and assembled.

यह बहुत सरल लगता है, लेकिन इसे साकार करने के लिए बहुत सारे टुकड़े एक साथ आए!

जावा डिज़ाइन पैटर्न पर अंतिम विचार

इस ट्यूटोरियल ने जावा स्ट्रक्चरल डिज़ाइन पैटर्न का अवलोकन प्रदान किया और एडाप्टर और ब्रिज पैटर्न का अधिक विस्तार से पता लगाया। हम अगली किस्त में कुछ और संरचनात्मक डिज़ाइन पैटर्न को कवर करेंगे।

देखना: जावा प्रोग्रामिंग कैरियर बंडल

Similar Posts