Table of Contents

Creational Design Patterns

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

विस्तार में सिंगलटन पैटर्न

सिंगलटन पैटर्न एक एकल उदाहरण के लिए एक वर्ग को प्रतिबंधित करता है और उस उदाहरण के लिए वैश्विक दृष्टिकोण प्रदान करता है। यह सरल पैटर्न में से एक है लेकिन परीक्षण क्षमता और युग्मन पर इसके प्रभाव के कारण सबसे विवादास्पद में से एक है।

कोर लक्षण

  • एकल उदाहरण की गारंटी: निजी निर्माता बाहरी तात्कालिकता को रोकता है। एक स्थिर विधि (often ) एकमात्र उदाहरण देता है।
  • Global Access: इस उदाहरण को किसी भी तरह से इस्तेमाल किया जा सकता है, अक्सर एक सार्वजनिक स्थैतिक चर या विधि के माध्यम से।
  • लसी या उत्सुक प्रारंभिककरण: इस उदाहरण को कक्षा लोडिंग समय (eager) पर बनाया जा सकता है या पहले अनुरोध (लचीला) तक स्थगित किया जा सकता है।

जब सिंगलटन उपयुक्त हो

  • ]Shared संसाधनों कि समन्वित किया जाना चाहिए: विन्यास प्रबंधकों, धागा पूल, कनेक्शन पूल, लॉगिंग सेवाओं, और हार्डवेयर इंटरफ़ेस ड्राइवरों अक्सर एक नियंत्रक की आवश्यकता होती है।
  • ]ग्लोबल राज्य जिसे डुप्लिकेट नहीं किया जाना चाहिए: कैश मैनेजर, फाइल सिस्टम अमूर्त परतें, या GUI फ्रेमवर्क में विंडो मैनेजर।
  • Resource-intensive ऑब्जेक्ट्स: ऑब्जेक्ट्स जो सिस्टम लाभ को एक ही उदाहरण से बनाने और पुनः उपयोग करने में महंगे हैं।

कार्यान्वयन विचार

थ्रेड सुरक्षा सबसे आम नुकसान है। एक नौसैनिक कार्यान्वयन जो की जांच करता है और फिर बहुसंख्यक वातावरण में कई उदाहरण उत्पन्न कर सकता है। समाधान में , स्थिर आंतरिक वर्ग (बिल प्यूग सिंगलटन) या जावा में एक enum-आधारित सिंगलटन के साथ डबल-चेकबंद लॉकिंग शामिल है। पायथन में, थ्रेड-सुरक्षित प्रारंभिककरण [[FLT: 3]] का उपयोग कर रहा है। उत्सुक और आलसी प्रारंभिककरण के बीच विकल्प इस बात पर निर्भर करता है कि सिंगलटन का उपयोग करने की गारंटी है और क्या इसकी रचना भारी है।

आलोचना और पिटफ

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

विस्तार में फैक्टरी विधि पैटर्न

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

कोर लक्षण

  • ]Encapsulated निर्माण तर्क: क्लाइंट कोड को कंक्रीट वर्ग नहीं जानता है; यह एक अमूर्त उत्पाद प्रकार के माध्यम से काम करता है।
  • Extensibility: नए उत्पाद प्रकार को मौजूदा ग्राहक कोड को संशोधित किए बिना नए कंक्रीट कारखानों को बनाने के द्वारा जोड़ा जा सकता है।
  • ]Deferred Instantiation: तत्काल करने के लिए सटीक वर्ग रनटाइम पर निर्धारित किया जाता है, इनपुट, विन्यास, या संदर्भ पर आधारित है।

जब फैक्टरी विधि Appropriate है

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

कार्यान्वयन विचार

एक विशिष्ट फैक्टरी विधि एक अमूर्त वर्ग का उपयोग करती है जो फैक्ट्री विधि (अक्सर अमूर्त) घोषित करती है। कंक्रीट रचनाकारों ने इस विधि को विशिष्ट उत्पादों को तत्काल करने के लिए ओवरराइड किया है। बिना विरासत (जैसे, जावास्क्रिप्ट), कारखाने एक कार्य या बंद हो सकता है। पैटर्न निर्भरता इंजेक्शन कंटेनरों के साथ अच्छी तरह से काम करता है जो कार्यान्वयन को प्रतिस्थापित कर सकते हैं। एक सामान्य संस्करण स्थैतिक कारखाना विधि (जैसे, [[FLT:]]] जावा में), लेकिन यह GoF फैक्टरी विधि पैटर्न के समान नहीं है - यह एक सरल मूर्ख्य है जो उपवर्ग शामिल नहीं है।

रियल-विश्व उदाहरण: दस्तावेज़ कनवर्टर

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

डायरेक्ट तुलना: सिंगलटन बनाम फैक्टरी विधि

हालांकि दोनों ही रचनात्मक पैटर्न हैं, उनके लक्ष्य और व्यापार-बंद लगभग प्रचलित हैं।

Aspect Singleton Factory Method
Primary goal Ensure a single instance Encapsulate object creation
Instance count Exactly one Many instances, but created through a factory
Control over class selection Not relevant (always same class) Subclasses or runtime logic choose the concrete class
Impact on maintainability Can increase coupling (global access) Reduces coupling (client depends on abstraction)
Testability Often problematic (global state) Good, as factories can be mocked
Extensibility Limited (hard to subclass a singleton) High (new products via new factories)

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

जब वे ओवरलैप करते हैं (और जब कोई उपयोग न किया जाए)

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

आधुनिक अनुप्रयोगों के लिए प्रैक्टिकल विचार

परीक्षण और निर्भरता इंजेक्शन

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

कॉनकॉरेंसी और वितरित सिस्टम

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

रियल-विश्व समाधान के लिए संयोजन पैटर्न

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

आम गलतियाँ से बचने के लिए

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

निष्कर्ष

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

आगे पढ़ने के लिए, ] पर क्लासिक गोफ पैटर्न देखें।Guru] और ]फैक्टरी विधि]]. इसके अलावा मार्टिन फाउलर के विश्लेषण पर विचार Registry] सिंगलटन के विकल्प के रूप में, और विकिपीडिया लेख ]फ़िलरी विधि पैटर्न ] भाषा-विशिष्ट कार्यान्वयन के लिए।