डिज़ाइन पैटर्न (कंप्यूटर विज्ञान)

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

अभ्यास

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

संरचना

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

डोमेन विशेष पैटर्न

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

ओवर-इंजीनियरिंग

डिज़ाइन पैटर्न का दुरुपयोग, अनावश्यक कोड को लागू करने में परिणत हो सकता है। यह कुशल सॉफ्टवेयर विकास की सादगी के प्रतिमान के विपरीत है।

लापता भाषा गुणों के लिए वर्कअराउंड

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

अन्य पृथक्करणों से अधिक भिन्न नहीं है

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