डिज़ाइन पैटर्न क्या है? देखें कि अन्य शब्दकोशों में "डिज़ाइन पैटर्न" क्या हैं

अपने ही हाथों से 08.07.2019
अपने ही हाथों से

मैंने हमारे जीवन में अक्सर उपयोग किए जाने वाले पैटर्न इत्यादि के बारे में संक्षेप में लिखने का निर्णय लिया।

एकाकी वस्तु

"एकल" का मुख्य बिंदु यह है कि जब आप कहते हैं "मुझे एक टेलीफोन एक्सचेंज की आवश्यकता है," तो वे आपसे कहेंगे "यह वहां पहले ही बनाया जा चुका है," न कि "चलो इसे फिर से बनाते हैं।" एक "अकेला" हमेशा अकेला होता है।

क्लास सिंगलटन (निजी स्थिर $उदाहरण = शून्य; निजी फ़ंक्शन __construct())( /* ... @रिटर्न सिंगलटन */ ) // नए सिंगलटन निजी फ़ंक्शन __क्लोन() ( /* ... @रिटर्न सिंगलटन के माध्यम से निर्माण से बचाव करें * / ) // निजी फ़ंक्शन की क्लोनिंग के माध्यम से निर्माण से बचाव करें __wakeup() ( /* ... @return Singleton */ ) // सार्वजनिक स्थैतिक फ़ंक्शन getInstance को अनसीरियलाइज करके निर्माण से बचाएं ( if (is_null(self::$instance) ) ) ( self::$instance = new self; ) return self::$instance; ) )

रजिस्ट्री (रजिस्ट्री, प्रविष्टियों का जर्नल)

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

क्लास रजिस्ट्री (निजी $रजिस्ट्री = सरणी(); सार्वजनिक फ़ंक्शन सेट ($कुंजी, $ऑब्जेक्ट) ($यह->रजिस्ट्री[$कुंजी] = $ऑब्जेक्ट; ) सार्वजनिक फ़ंक्शन प्राप्त करें($कुंजी) ( $यह->रजिस्ट्री वापस करें [$कुंजी]; ) )

सिंगलटन रजिस्ट्री- भ्रमित न हों)

"रजिस्ट्री" अक्सर "एकाकी" होती है, लेकिन यह हमेशा उसी तरह से नहीं होनी चाहिए। उदाहरण के लिए, हम लेखा विभाग में कई जर्नल बना सकते हैं, एक में "ए" से "एम" तक के कर्मचारी हैं, दूसरे में "एन" से "जेड" तक के कर्मचारी हैं। ऐसी प्रत्येक पत्रिका एक "रजिस्ट्री" होगी, लेकिन "एकल" नहीं, क्योंकि पहले से ही 2 पत्रिकाएँ हैं।

क्लास सिंगलटनरजिस्ट्री (निजी स्थिर $उदाहरण = शून्य; निजी $रजिस्ट्री = सरणी(); निजी फ़ंक्शन __construct() ( /* ... @रिटर्न सिंगलटन */ ) // नए सिंगलटन निजी फ़ंक्शन के माध्यम से निर्माण से सुरक्षित रखें __क्लोन() ( / * ... @रिटर्न सिंगलटन */ ) // निजी फ़ंक्शन क्लोनिंग के माध्यम से निर्माण से बचाव करें __wakeup() ( /* ... @रिटर्न सिंगलटन */ ) // सार्वजनिक स्थैतिक फ़ंक्शन getInstance() को अनसीरियलाइज़ करके निर्माण से बचाएं ( यदि ( is_null(self::$instance)) ( self::$instance = new self; ) return self::$instance; ) public function set($key, $object) ( $this->registry[$key] = $ ऑब्जेक्ट; ) सार्वजनिक फ़ंक्शन प्राप्त करें ($ कुंजी) ( $ यह लौटाएं-> रजिस्ट्री [$ कुंजी]; ))

मल्टीटन ("एकल" का पूल) या दूसरे शब्दों मेंरजिस्ट्री सिंगलटन ) - सिंगलटन रजिस्ट्री के साथ भ्रमित न हों

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

छोटा: आपको इस वर्ग के ऑब्जेक्ट बनाने की अनुमति देता है, लेकिन केवल तभी जब आप ऑब्जेक्ट को नाम देते हैं। इसका कोई वास्तविक जीवन उदाहरण नहीं है, लेकिन मुझे इंटरनेट पर निम्नलिखित उदाहरण मिला:

क्लास डेटाबेस (निजी स्थिर $उदाहरण = सरणी(); निजी फ़ंक्शन __construct() ( ) निजी फ़ंक्शन __clone() ( ) सार्वजनिक स्थैतिक फ़ंक्शन getInstance($key) ( if(!array_key_exists($key, self::$instances)) ( self::$instances[$key] = new self(); ) return self::$instances[$key]; ) ) $master = Database::getInstance("master"); var_dump($मास्टर); //ऑब्जेक्ट(डेटाबेस)#1 (0) ( ) $लॉगर = डेटाबेस::getInstance("लॉगर"); var_dump($लॉगर); //ऑब्जेक्ट(डेटाबेस)#2 (0) ( ) $masterDupe = डेटाबेस::getInstance("master"); var_dump($masterDupe); // ऑब्जेक्ट(डेटाबेस)#1 (0) ( ) // गंभीर त्रुटि: निजी डेटाबेस पर कॉल करें::__construct() अमान्य संदर्भ से $dbFatalError = new Database(); // PHP गंभीर त्रुटि: निजी डेटाबेस पर कॉल करें::__clone() $dbCloneError = क्लोन $masterDupe;

ऑब्जेक्ट पूल

मूलतः यही पैटर्न है एक "रजिस्ट्री" जो केवल वस्तुओं को संग्रहीत करती है, कोई स्ट्रिंग, सरणियाँ आदि नहीं। डेटा के प्रकार।

कारखाना

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

सार वर्ग एनिमलएब्स्ट्रैक्ट (संरक्षित $प्रजाति; सार्वजनिक फ़ंक्शन getSpecies() ( रिटर्न $यह->प्रजाति; ) ) क्लास कैट एनिमलएब्स्ट्रैक्ट (संरक्षित $प्रजाति = "बिल्ली"; ) का विस्तार करता है क्लास डॉग एनिमलएब्स्ट्रैक्ट (संरक्षित $प्रजाति = "कुत्ता"; का विस्तार करता है; ) क्लास एनिमलफैक्ट्री (पब्लिक स्टैटिक फंक्शन फैक्ट्री ($एनिमल) ( स्विच ($एनिमल) ( केस "कैट": $obj = न्यू कैट(); ब्रेक; केस "डॉग": $obj = न्यू डॉग(); ब्रेक; डिफॉल्ट : नया अपवाद फेंकें ("पशु फैक्ट्री प्रजाति का जानवर नहीं बना सकी" "। $animal . """, 1000); ) रिटर्न $obj; ) ) $cat = एनिमलफैक्ट्री::फैक्ट्री("बिल्ली"); //ऑब्जेक्ट(कैट)#1 इको $कैट->गेटस्पीशीज़(); // बिल्ली $कुत्ता = एनिमलफैक्ट्री::फैक्ट्री("कुत्ता"); //ऑब्जेक्ट(कुत्ता)#1 प्रतिध्वनि $कुत्ता->getSpecies(); // कुत्ता $हिप्पो = एनिमलफैक्ट्री::फैक्ट्री("हिप्पोपोटेमस"); // यह एक अपवाद फेंक देगा

मैं आपका ध्यान इस तथ्य की ओर आकर्षित करना चाहूँगा कि फ़ैक्टरी विधि भी एक पैटर्न है; इसे फ़ैक्टरी विधि कहा जाता है।

बिल्डर (निर्माता)

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

क्लास बोतल (सार्वजनिक $नाम; सार्वजनिक $लीटर; ) /** * सभी बिल्डरों को */ इंटरफ़ेस बोतलबिल्डरइंटरफ़ेस (सार्वजनिक फ़ंक्शन सेटनाम(); सार्वजनिक फ़ंक्शन सेटलिटर(); सार्वजनिक फ़ंक्शन getResult(); ) क्लास कोकाकोलाबिल्डर बोतलबिल्डरइंटरफ़ेस लागू करना चाहिए (निजी $ बोतल; सार्वजनिक फ़ंक्शन __construct() ($यह->बोतल = नई बोतल(); ) सार्वजनिक फ़ंक्शन सेटनाम($मूल्य) ($यह->बोतल->नाम = $मूल्य; ) सार्वजनिक फ़ंक्शन सेटलिटर($मूल्य) ($ यह->बोतल->लीटर = $मूल्य; ) सार्वजनिक फ़ंक्शन getResult() ( वापसी $यह->बोतल; ) ) $जूस = नया CocaColaBuilder(); $जूस->सेटनाम('कोका-कोला लाइट'); $जूस->सेटलीटर(2); $जूस->getResult();

प्रोटोटाइप

एक कारखाने के समान, यह वस्तुओं को बनाने का भी काम करता है, लेकिन थोड़े अलग दृष्टिकोण के साथ। कल्पना कीजिए कि आप एक बार में बीयर पी रहे थे और आपकी बीयर खत्म हो रही है, आप बारटेंडर से कहते हैं - मेरे लिए भी उसी तरह की एक और बीयर बना दो। बारटेंडर उस बीयर को देखता है जिसे आप पी रहे हैं और आपके कहे अनुसार उसकी एक प्रति बना लेता है। PHP में पहले से ही इस पैटर्न का कार्यान्वयन है, इसे कहा जाता है।

$newJuice = क्लोन $जूस;

आलसी आरंभीकरण

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

डिपेंडेंसी इंजेक्शन

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

क्लास AppleJuice() // यह विधि डिपेंडेंसी इंजेक्शन पैटर्न का एक आदिम कार्यान्वयन है और आगे आप इस फ़ंक्शन को getBottleJuice())( $obj = new) देखेंगे सेब का रससेब का रस$obj)( वापसी $obj; ) ) $bottleJuice = getBottleJuice();

अब कल्पना कीजिए कि अब हमें सेब का जूस नहीं, संतरे का जूस चाहिए।

कक्षा AppleJuice() कक्षा संतरे का रस() // यह विधि डिपेंडेंसी इंजेक्शन फ़ंक्शन getBottleJuice())( $obj = new को लागू करती है संतरे का रस; //आइए वस्तु की जांच करें, नहीं तो उन्होंने अचानक हमारे लिए बीयर खिसका दी (बीयर जूस नहीं है) अगर( संतरे का रस$obj)( वापसी $obj; ) )

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

इंटरफ़ेस जूस () क्लास ऐप्पलजूस जूस लागू करता है () क्लास ऑरेंजजूस जूस लागू करता है () फ़ंक्शन getBottleJuice())( $obj = नया ऑरेंजजूस; // ऑब्जेक्ट की जांच करें, अगर उन्होंने हमें बियर फिसला दिया है (बीयर जूस नहीं है) अगर( रस$obj)( वापसी $obj; ) )

निर्भरता व्युत्क्रम को कभी-कभी निर्भरता इंजेक्शन के साथ भ्रमित किया जाता है, लेकिन उन्हें भ्रमित करने की कोई आवश्यकता नहीं है, क्योंकि निर्भरता व्युत्क्रम एक सिद्धांत है, कोई पैटर्न नहीं।

सेवा लोकेटर

"सर्विस लोकेटर" "निर्भरता इंजेक्शन" को लागू करने की एक विधि है। यह आरंभीकरण कोड के आधार पर विभिन्न प्रकार की वस्तुएं लौटाता है। कार्य किसी बिल्डर, फैक्ट्री या किसी अन्य द्वारा बनाए गए हमारे जूस पैकेज को खरीदार की इच्छानुसार वहां पहुंचाने का हो। हम लोकेटर से कहते हैं "हमें एक डिलीवरी सेवा दें" और सेवा से वांछित पते पर जूस पहुंचाने के लिए कहें। आज एक सेवा है, और कल दूसरी हो सकती है। हमारे लिए यह मायने नहीं रखता कि यह कौन सी विशिष्ट सेवा है, हमारे लिए यह जानना महत्वपूर्ण है कि यह सेवा वही प्रदान करेगी जो हम इसे बताएंगे और जहां हम इसे बताएंगे। बदले में, सेवाएँ "डिलीवर" लागू करती हैं<предмет>पर<адрес>».

अगर हम वास्तविक जीवन के बारे में बात करें, तो शायद सर्विस लोकेटर का एक अच्छा उदाहरण पीडीओ PHP एक्सटेंशन होगा, क्योंकि आज हम MySQL डेटाबेस के साथ काम करते हैं, और कल हम PostgreSQL के साथ काम कर सकते हैं। जैसा कि आप पहले ही समझ चुके हैं, हमारे वर्ग के लिए यह मायने नहीं रखता कि वह अपना डेटा किस डेटाबेस को भेजता है, यह महत्वपूर्ण है कि वह ऐसा कर सके।

$db = नया पीडीओ(" माई एसक्यूएल:dbname=test;host=localhost", $user, $pass); $db = new PDO(" pgsql:dbname=परीक्षण होस्ट=लोकलहोस्ट", $उपयोगकर्ता, $पास);

डिपेंडेंसी इंजेक्शन और सर्विस लोकेटर के बीच अंतर

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

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

ओओएपी पैटर्न विस्तार के स्तर और अमूर्तता के स्तर में भिन्न होते हैं। उनके अनुप्रयोग की श्रेणियों के अनुसार पैटर्न का निम्नलिखित सामान्य वर्गीकरण प्रस्तावित है:

  • स्थापत्य पैटर्न
  • डिजाइन पैटर्न्स
  • विश्लेषण पैटर्न
  • परीक्षण पैटर्न
  • कार्यान्वयन पैटर्न

स्थापत्य पैटर्न- उनके बीच संबंध स्थापित करने के लिए उनकी जिम्मेदारियों, नियमों और बुनियादी सिद्धांतों के विनिर्देश के साथ पूर्वनिर्धारित उपप्रणालियों का एक सेट।

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

डिजाइन पैटर्न्स- किसी सॉफ़्टवेयर सिस्टम के सबसिस्टम या घटकों की संरचना और उनके बीच संबंधों को स्पष्ट करने के लिए विशेष आरेख।

डिजाइन पैटर्न्सएक सॉफ्टवेयर सिस्टम के तत्वों के बीच बातचीत की सामान्य संरचना का वर्णन करें जो एक विशिष्ट संदर्भ में मूल डिजाइन समस्या को लागू करता है। इस श्रेणी में सबसे प्रसिद्ध पैटर्न GoF (गैंग ऑफ फोर) पैटर्न हैं, जिनका नाम ई. गामा, आर. हेल्म, आर. जॉनसन और जे. व्लिसाइड्स के नाम पर रखा गया है, जिन्होंने उन्हें व्यवस्थित किया और एक सामान्य विवरण प्रस्तुत किया। GoF पैटर्न में 23 पैटर्न शामिल हैं। ये पैटर्न कार्यान्वयन भाषा से स्वतंत्र हैं, लेकिन उनका कार्यान्वयन एप्लिकेशन डोमेन पर निर्भर करता है।

लेख शुरू करने से पहले, मैं प्रोग्रामिंग में डिज़ाइन पैटर्न पर अपने मित्र डेनिस पोरप्लेंको की एक रिपोर्ट पेश करना चाहता हूं:

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

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

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

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

बुनियादी प्रोग्रामिंग पैटर्न

मौलिक

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

जनरेटिव पैटर्न

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

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

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

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

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

समानांतर प्रोग्रामिंग पैटर्न

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

सिस्टम आर्किटेक्चर पैटर्न

मॉडल-व्यू-नियंत्रक(एमवीसी) - मॉडल-व्यू-नियंत्रक।
मॉडल-दृश्य-प्रस्तोता
मॉडल-व्यू-व्यू मॉडल
प्रस्तुति-अमूर्त-नियंत्रण
नग्न वस्तुएं
पदानुक्रमित मॉडल-दृश्य-नियंत्रक

एंटरप्राइज़ टेम्पलेट्स

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

अन्य प्रकार के टेम्पलेट

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

डिज़ाइन पैटर्न क्या हैं? एक पैटर्न सामान्य डिज़ाइन समस्याओं को हल करने के लिए प्रोग्राम कोड के निर्माण के एक विशिष्ट तरीके का प्रतिनिधित्व करता है। में इस मामले मेंयह मानता है कि सामान्य औपचारिक समस्याओं का एक सेट होता है जो अक्सर घटित होता है, और पैटर्न इन समस्याओं को हल करने के लिए सिद्धांतों का एक सेट प्रदान करते हैं।

हालाँकि डिज़ाइन के क्षेत्र में सामान्य समस्याओं के समाधान का वर्णन करने के तरीके के रूप में पैटर्न का विचार काफी समय पहले सामने आया था, लेकिन उनकी लोकप्रियता बड़े पैमाने पर चार लेखकों एरिच गामा, रिचर्ड हेल्म, राल्फ जॉनसन के प्रसिद्ध काम के कारण बढ़ने लगी। , जॉन व्लिसाइड्स, जिसे "डिज़ाइन पैटर्न: पुन: प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर के तत्व" कहा जाता था (रूसी में इसे "ऑब्जेक्ट-ओरिएंटेड डिज़ाइन तकनीक। डिज़ाइन पैटर्न" के रूप में जाना जाता है) और जो 1994 में प्रकाशित हुआ था। और स्वयं लेखकों की टीम को अक्सर "गैंग ऑफ़ फोर" या गैंग ऑफ़ फोर, या संक्षेप में GoF कहा जाता है। यह पुस्तक मूलतः प्रोग्राम डिज़ाइन के सामान्य तरीकों का वर्णन करने वाला पहला बड़े पैमाने का प्रयास था। और समय के साथ, पैटर्न का उपयोग अच्छा प्रोग्रामिंग अभ्यास माना जाने लगा।

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

इसके अलावा, पैटर्न, एक नियम के रूप में, प्रोग्रामिंग भाषा पर निर्भर नहीं होते हैं। उनके अनुप्रयोग के सिद्धांत C#, Jave और अन्य भाषाओं में समान होंगे। हालाँकि इस गाइड में हम C# भाषा के संदर्भ में पैटर्न के बारे में बात करेंगे।

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

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

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

जनरेटिव पैटर्न

जनरेटिव पैटर्न ऐसे पैटर्न हैं जो तात्कालिकता की प्रक्रिया या, दूसरे शब्दों में, कक्षाओं और वस्तुओं को उत्पन्न करने की प्रक्रिया को अमूर्त करते हैं। उनमें से निम्नलिखित प्रमुख हैं:

    निर्माता

    प्रोटोटाइप

    एकाकी वस्तु

पैटर्न का एक और समूह - संरचनात्मक पैटर्न- जांच करता है कि कैसे कक्षाएं और वस्तुएं बड़ी संरचनाएं बनाती हैं - कक्षाएं और वस्तुएं जो प्रकृति में अधिक जटिल हैं। इन टेम्पलेट्स में शामिल हैं:

    अनुकूलक

    पुल

    कम्पोजिट

    डेकोरेटर

    मुखौटा

    फ्लाईवेट

    डिप्टी (प्रॉक्सी)

पैटर्न के तीसरे समूह को व्यवहारिक कहा जाता है - वे वर्गों और वस्तुओं के बीच एल्गोरिदम और इंटरैक्शन को परिभाषित करते हैं, यानी उनका व्यवहार। ऐसे टेम्पलेट्स में निम्नलिखित हैं:

    आज्ञा

    दुभाषिया

    इटरेटर

    मध्यस्थ

    संरक्षक (स्मृति चिन्ह)

    देखने वाला

    राज्य

    रणनीति

    टेम्पलेट विधि

    आगंतुक

पैटर्न के अन्य वर्गीकरण भी हैं जो इस पर निर्भर करते हैं कि पैटर्न वर्गों या वस्तुओं से संबंधित है या नहीं।

वर्ग पैटर्न वंशानुक्रम के माध्यम से वर्गों के बीच संबंधों का वर्णन करते हैं। कक्षाओं के बीच संबंध संकलन समय पर निर्धारित होते हैं। इन पैटर्न में शामिल हैं:

    फ़ैक्टरी विधि

    दुभाषिया

    टेम्पलेट विधि

    अनुकूलक

पैटर्न का दूसरा भाग - वस्तु पैटर्नवस्तुओं के बीच संबंधों का वर्णन करें। ये रिश्ते रनटाइम पर होते हैं और इसलिए अधिक लचीले होते हैं। ऑब्जेक्ट पैटर्न में निम्नलिखित शामिल हैं:

    सार कारखाना

    निर्माता

    प्रोटोटाइप

    एकाकी वस्तु

    पुल

    कम्पोजिट

    डेकोरेटर

    मुखौटा

    फ्लाईवेट

    डिप्टी (प्रॉक्सी)

    ज़िम्मेदारी की शृंखला

    आज्ञा

    इटरेटर

    मध्यस्थ

    संरक्षक (स्मृति चिन्ह)

    देखने वाला

    राज्य

    रणनीति

    आगंतुक

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

और इस गाइड में हम C# भाषा के संबंध में उनके उपयोग के सबसे बुनियादी और सामान्य पैटर्न और सिद्धांतों को देखेंगे।

सही पैटर्न कैसे चुनें?

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

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

और अंततः, हमें KISS सिद्धांत (कीप इट सिंपल, स्टुपिड) का पालन करना चाहिए - प्रोग्राम कोड को यथासंभव सरल और स्पष्ट रखें। आख़िरकार, पैटर्न का मुद्दा प्रोग्राम कोड को जटिल बनाना नहीं है, बल्कि इसे सरल बनाना है।

यदि आपने कभी सोचा है कि डिज़ाइन पैटर्न क्या हैं, तो आपका स्वागत है। इस लेख में मैं आपको बताऊंगा कि वे क्या हैं, उनकी आवश्यकता क्यों है, उनका उपयोग कैसे करें, और PHP में सबसे आम टेम्पलेट्स के उदाहरण देंगे।

डिज़ाइन पैटर्न क्या हैं?

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

टेम्पलेट तीन प्रकार के होते हैं:

  • संरचनात्मक;
  • उत्पन्न करना;
  • व्यवहारिक.

संरचनात्मकटेम्प्लेट कक्षाओं और वस्तुओं के बीच संबंधों को परिभाषित करते हैं, जिससे उन्हें एक साथ काम करने की अनुमति मिलती है।

उत्पादकटेम्प्लेट आरंभीकरण तंत्र प्रदान करते हैं, जिससे आप सुविधाजनक तरीके से ऑब्जेक्ट बना सकते हैं।

व्यवहारटेम्प्लेट का उपयोग संस्थाओं के बीच इंटरैक्शन को सरल बनाने के लिए किया जाता है।

डिज़ाइन पैटर्न की आवश्यकता क्यों है?

एक डिज़ाइन पैटर्न, मूल रूप से, किसी विशेष समस्या का एक विचारशील समाधान है। यदि आप किसी ज्ञात समस्या का सामना कर रहे हैं, तो तैयार, सिद्ध समाधान का उपयोग क्यों न करें?

उदाहरण

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

कक्षा रणनीतिऔरएडाप्टरउदाहरणक्लास{

निजी $_class_one ;

निजी $_class_two ;

निजी $_संदर्भ ;

सार्वजनिक फ़ंक्शन __construct ($संदर्भ) (

$यह -> _संदर्भ = $संदर्भ;

सार्वजनिक फ़ंक्शन ऑपरेशन1() (

यदि ($यह -> _संदर्भ == "संदर्भ_for_class_one") (

$यह -> _class_one -> ऑपरेशन1_इन_क्लास_वन_संदर्भ() ;

) अन्य ($यह -> _संदर्भ == "संदर्भ_for_class_two" ) (

$यह -> _class_two -> ऑपरेशन1_इन_क्लास_दो_संदर्भ() ;

सरल, है ना? आइए रणनीति टेम्पलेट पर करीब से नज़र डालें।

टेम्पलेट "रणनीति"

रणनीति- एक व्यवहार पैटर्न जो आपको विभिन्न वर्गों में कई एल्गोरिदम को समाहित करके संदर्भ के आधार पर निष्पादन के दौरान एक कार्यक्रम के व्यवहार का चयन करने की अनुमति देता है।

उपरोक्त उदाहरण में, रणनीति का चुनाव ऑब्जेक्ट के निर्माण के समय $context वेरिएबल के मान पर आधारित होता है। यदि मान "context_for_class_one" था, तो प्रोग्राम क्लास class_one का उपयोग करेगा। और इसके विपरीत।

ठीक है, लेकिन इसका उपयोग कहां किया जा सकता है?


कल्पना करें कि आप एक ऐसा वर्ग विकसित कर रहे हैं जो डेटाबेस में रिकॉर्ड बना या अपडेट कर सकता है। दोनों मामलों में, इनपुट पैरामीटर समान होंगे (नाम, पता, फ़ोन नंबर, आदि), लेकिन, स्थिति के आधार पर, उसे रिकॉर्ड को अपडेट करने और बनाने के लिए विभिन्न फ़ंक्शन का उपयोग करना होगा। आप हर बार यदि/अन्यथा स्थिति को फिर से लिख सकते हैं, या आप एक विधि बना सकते हैं जो संदर्भ को स्वीकार करेगी:

आमतौर पर, रणनीति पैटर्न में एल्गोरिदम को कक्षाओं में समाहित करना शामिल होता है, लेकिन इस मामले में यह अनावश्यक है। याद रखें कि आपको टेम्पलेट का शब्दशः पालन करने की आवश्यकता नहीं है। कोई भी विकल्प स्वीकार्य है यदि वे समस्या का समाधान करते हैं और अवधारणा के अनुरूप हैं।

एडाप्टर टेम्पलेट


अनुकूलक- एक संरचनात्मक पैटर्न जो आपको एक ऐसे वर्ग का उपयोग करने की अनुमति देता है जो वांछित कार्यों को लागू करता है, लेकिन एक अनुचित इंटरफ़ेस है।

यह आपको आंतरिक वर्ग इंटरफ़ेस के साथ संगत होने के लिए कुछ इनपुट बदलने की भी अनुमति देता है।

इसका उपयोग कैसे करना है?


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

दो उदाहरणों की तुलना करें.

बिना एडाप्टर के

$उपयोगकर्ता = नया उपयोगकर्ता();

$उपयोगकर्ता ->

$प्रोफ़ाइल = नया प्रोफ़ाइल() ;

$प्रोफ़ाइल -> CreateOrUpdate(//parameters);

यदि हमें ऐसे कोड का पुन: उपयोग करना है, तो हमें पूरी चीज़ को फिर से लिखने के लिए मजबूर होना पड़ेगा।

एडॉप्टर का उपयोग करना

हम एक अकाउंट रैपर क्लास बना सकते हैं:

वर्ग खाता()

सार्वजनिक फ़ंक्शन न्यूअकाउंट (//पैरामीटर)

$उपयोगकर्ता = नया उपयोगकर्ता();

$ उपयोगकर्ता -> CreateOrUpdate ( // पैरामीटर का हिस्सा);

$प्रोफ़ाइल = नया प्रोफ़ाइल() ;

$प्रोफ़ाइल -> CreateOrUpdate ( // पैरामीटर का हिस्सा);

$account_domain = नया खाता();

$account_domain -> NewAccount (//पैरामीटर);

अब हम हर बार अकाउंट क्लास का उपयोग कर सकते हैं और इसके अलावा हम इसमें अतिरिक्त कार्यक्षमता भी जोड़ सकते हैं।

फ़ैक्टरी विधि टेम्पलेट


कारखाना- एक जनरेटिंग टेम्प्लेट, जो विभिन्न ऑब्जेक्ट बनाने की विधि वाला एक वर्ग है।

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

इसका उपयोग कैसे करना है?


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

सबसे पहले, आइए तीन वर्ग बनाएँ:

सार वर्ग बटन(

संरक्षित $_html ;

सार्वजनिक फ़ंक्शन getHtml()

यह $ वापस करें -> _html ;

क्लास इमेजबटन बटन का विस्तार करता है (

संरक्षित $_html = "..." ; // छवि बटन के लिए HTML कोड

क्लास इनपुटबटन बटन का विस्तार करता है (

संरक्षित $_html = "..." ; // नियमित बटन के लिए HTML कोड ( );

क्लास फ्लैशबटन बटन का विस्तार करता है (

संरक्षित $_html = "..." ; // फ़्लैश बटन का HTML कोड

अब हम अपना कारखाना लिख ​​सकते हैं:

क्लास बटनफैक्ट्री

सार्वजनिक स्थैतिक फ़ंक्शन क्रिएटबटन ($ प्रकार)

$बेसक्लास = "बटन" ;

$targetClass = ucfirst ($प्रकार)। $बेसक्लास;

यदि (class_exists ($targetClass ) && is_subclass_of ($targetClass , $baseClass ) ) (

नया $targetClass लौटाएं;

) अन्य (

नया अपवाद फेंकें ( "बटन प्रकार "$प्रकार" पहचाना नहीं गया है।") ;

और इसका उपयोग करें:

$बटन = सरणी ("छवि", "इनपुट", "फ़्लैश");

foreach ($b के रूप में बटन) (

इको बटनफैक्टरी::क्रिएटबटन($बी) -> getHtml()

आउटपुट सभी प्रकार के बटनों के साथ HTML होना चाहिए। इस तरह हम यह निर्दिष्ट करने में सक्षम थे कि हम किस प्रकार का बटन चाहते हैं और कोड का पुन: उपयोग कर सकते हैं।

डेकोरेटर टेम्पलेट


डेकोरेटरएक संरचनात्मक पैटर्न है जो आपको स्थिति के आधार पर प्रोग्राम निष्पादन के दौरान किसी ऑब्जेक्ट में नया व्यवहार जोड़ने की अनुमति देता है।

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

डेकोरेटर को लागू करने के लिए हमें चाहिए:

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

इसका उपयोग कैसे करना है?


मान लीजिए कि हमारे पास एक वस्तु है जिसे एक निश्चित स्थिति में एक निश्चित व्यवहार की आवश्यकता है। उदाहरण के लिए, हमारे पास आपके खाते से लॉग आउट करने के लिए एक HTML लिंक है जो इस बात पर निर्भर करता है कि हम किस पेज पर हैं, यह अलग-अलग दिखाई देना चाहिए। यह वही स्थिति है जब सज्जाकार हमारी सहायता करेंगे।

सबसे पहले, आइए तय करें कि हमें किस "दृश्यावली" की आवश्यकता है:

  • यदि हम मुख्य पृष्ठ पर हैं और लॉग इन हैं, तो लिंक h2 टैग में होना चाहिए।
  • यदि हम किसी अन्य पृष्ठ पर हैं और लॉग इन हैं, तो लिंक को रेखांकित किया जाना चाहिए।
  • यदि हम लॉग इन हैं, तो लिंक स्ट्रांग टैग में होना चाहिए।

अब हम डेकोरेटर्स को स्वयं लिख सकते हैं:

क्लास HtmlLinks(

क्लास लॉगआउटलिंक HtmlLinks का विस्तार करता है (

संरक्षित $_html ;

सार्वजनिक फ़ंक्शन __construct() (

$यह -> _html = "लॉगआउट" ;

}

सार्वजनिक फ़ंक्शन सेटएचटीएमएल ($एचटीएमएल) (

$यह -> _html = $html ;

}

सार्वजनिक फ़ंक्शन रेंडर() (

प्रतिध्वनि $यह -> _html ;

}

वर्ग LogoutLinkH2Decorator HtmlLinks का विस्तार करता है (

संरक्षित $_logout_link ;

$यह -> _लॉगआउट_लिंक = $लॉगआउट_लिंक;

$this -> setHtml ("" . $this -> _html . "" );

}

सार्वजनिक फ़ंक्शन __कॉल ($नाम, $args) (

$यह -> _लॉगआउट_लिंक -> $नाम ($args [ 0 ] );

क्लास लॉगआउटलिंकअंडरलाइनडेकोरेटर HtmlLinks का विस्तार करता है (

संरक्षित $_लॉगआउट_लिंक;

सार्वजनिक फ़ंक्शन __construct ($लॉगआउट_लिंक) (



हम पढ़ने की सलाह देते हैं

शीर्ष