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

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

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

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

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

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

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

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

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

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

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

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

नीचे यूएमएल वर्ग और अनुक्रम आरेख भी देखें।

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

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

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

आउटपुट है: Originator: Setting state to State1 Originator: Setting state to State2

Originator: Saving to Memento.

Originator: Setting state to State3 Originator: Saving to Memento.

Originator: Setting state to State4 Originator: State after restoring from Memento: State3 यह उदाहरण स्थिति के रूप में स्ट्रिंग का उपयोग करता है, जो जावा में एक अपरिवर्तनीय ऑब्जेक्ट है। वास्तविक जीवन के परिदृश्य में स्थिति लगभग सदैव एक परिवर्तनशील ऑब्जेक्ट होगा, जिस स्थिति में स्थिति की एक प्रति बनाई जानी चाहिए।

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

स्मृति चिन्ह प्राप्त करने के मुख्य रूप से तीन अन्य विधियां हैं:
 * 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