स्मृति चिन्ह पैटर्न

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

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

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

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

स्मृति चिन्ह डिज़ाइन पैटर्न किन समस्याओं को हल कर सकता है?

 * किसी ऑब्जेक्ट की आंतरिक स्थिति को बाह्य रूप से सुरक्षित किया जाना चाहिए ताकि ऑब्जेक्ट को बाद में इस स्थिति में पुनःस्थापित किया जा सके।
 * ऑब्जेक्ट के संपुटीकरण का उल्लंघन नहीं किया जाना चाहिए।

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

स्मृति चिन्ह डिज़ाइन पैटर्न किस समाधान का वर्णन करता है?
किसी ऑब्जेक्ट (प्रवर्तक) को स्वयं के लिए उत्तरदायी बनाएं
 * अपनी आंतरिक स्थिति को एक (स्मृति चिन्ह) ऑब्जेक्ट में सहेजना और
 * एक (स्मृति चिन्ह) ऑब्जेक्ट से पूर्व  स्थिति में बहाल करना।

स्मृति चिन्ह बनाने वाले को ही इसे एक्सेस करने की अनुमति है।

एक ग्राहक (कार्यवाहक) प्रवर्तक से एक स्मृति चिन्ह का अनुरोध कर सकता है (प्रवर्तक की आंतरिक स्थिति को बचाने के लिए) और एक स्मृति चिन्ह को प्रवर्तक को वापस भेज सकता है (पूर्व  स्थिति को पुनर्स्थापित करने के लिए)।

यह एक प्रवर्तक की आंतरिक स्थिति को उसके संपुटीकरण का उल्लंघन किए बिना बचाने और पुनर्स्थापित करने में सक्षम बनाता है।

नीचे यूएमएल क्लास और सीक्वेंस डायग्राम भी देखें।

यूएमएल वर्ग और अनुक्रम आरेख
उपरोक्त यूएमएल वर्ग आरेख में, वर्ग को संदर्भित करता है  कक्षा बचत के लिए और बहाल करना  प्रवर्तक की आंतरिक स्थिति। ई> वर्ग लागू करता है (1)  a बनाकर और वापस करके   ऑब्जेक्ट जो प्रवर्तक की वर्तमान आंतरिक स्थिति को संग्रहीत करती है और (2)  पारित से स्थिति बहाल करके   ऑब्जेक्ट।

एकीकृत मॉडलिंग भाषा अनुक्रम आरेख रन-टाइम इंटरैक्शन दिखाता है: (1) प्रवर्तक की आंतरिक स्थिति को सहेजना:  ई> ऑब्जेक्ट कॉल   पर   ऑब्जेक्ट, जो एक बनाता है  ऑब्जेक्ट, बचाता है इसकी वर्तमान आंतरिक स्थिति, और लौटाता है  तक. (2) प्रवर्तक की आंतरिक स्थिति को बहाल करना:  ई> कॉल   पर   ऑब्जेक्ट और निर्दिष्ट करता है   ऑब्जेक्ट जो उस स्थिति को संग्रहीत करता है जिसे पुनर्स्थापित किया जाना चाहिए।   ई> स्थिति प्राप्त करता है  से   अपना स्थिति स्थापित करने के लिए।

जावा उदाहरण
निम्नलिखित जावा प्रोग्राम स्मृति चिन्ह पैटर्न के पूर्ववत उपयोग को दिखाता है।

आउटपुट है: प्रवर्तक: स्थिति को स्थिति1 पर सेट करना प्रवर्तक: स्थिति को स्थिति2 पर सेट करना प्रवर्तक: स्मृति चिह्न के लिए सहेजा जा रहा है। ओरिजिनेटर: स्टेट को स्टेट पर सेट करना3 प्रवर्तक: स्मृति चिह्न के लिए सहेजा जा रहा है। प्रवर्तक: स्थिति को स्थिति के रूप में स्थापित करना4 प्रवर्तक: स्मृति चिन्ह से पुनर्स्थापित करने के बाद स्थिति: स्थिति 3

यह उदाहरण स्थिति के रूप में एक स्ट्रिंग का उपयोग करता है, जो जावा में एक अपरिवर्तनीय ऑब्जेक्ट है। वास्तविक जीवन के परिदृश्य में स्थिति करेगा लगभग हमेशा एक परिवर्तनशील ऑब्जेक्ट होती है, जिस स्थिति में स्थिति की एक प्रति बनाई जानी चाहिए।

यह कहा जाना चाहिए कि दिखाए गए कार्यान्वयन में एक खामी है: यह एक आंतरिक वर्ग की घोषणा करता है। यह बेहतर होगा यदि यह स्मृति चिन्ह रणनीति एक से अधिक प्रवर्तकों पर लागू हो।

स्मृति चिन्ह प्राप्त करने के मुख्य रूप से तीन अन्य तरीके हैं:
 * 1) क्रमांकन।
 * 2) एक ही पैकेज में घोषित वर्ग।
 * 3) ऑब्जेक्ट को एक प्रॉक्सी के माध्यम से भी एक्सेस किया जा सकता है, जो ऑब्जेक्ट पर किसी भी सेव / रिस्टोर संचालन को प्राप्त कर सकता है।

सी # उदाहरण
स्मृति चिन्ह पैटर्न किसी व्यक्ति को संपुटीकरण का उल्लंघन किए बिना किसी ऑब्जेक्ट की आंतरिक स्थिति को कैप्चर करने की अनुमति देता है जैसे कि बाद में यदि आवश्यक हो तो परिवर्तनों को पूर्ववत/वापस कर सकता है। यहाँ कोई देख सकता है कि स्मृति चिन्ह ऑब्जेक्ट वास्तव में ऑब्जेक्ट में किए गए परिवर्तनों को वापस लाने के लिए उपयोग की जाती है।

बाह्य संबंध

 * Description of Memento Pattern in Ada
 * Memento UML Class Diagram with C# and .NET code samples
 * SourceMaking Tutorial
 * Memento Design Pattern using Java