ऐसी स्थितियों में मैंने कभी-कभी कई परतों के साथ "संदर्भ" शब्द का सफलतापूर्वक परिचय (पुन: उपयोग) किया है।
इसका मतलब एक सिंगलटन है, इस प्रकार "वैश्विक" ऑब्जेक्ट स्टोर, जिसमें से इस तरह की वस्तुओं का अनुरोध किया जा सकता है। उन कोडों की आवश्यकता होती है, जिनमें स्टोर के हेडर शामिल होते हैं, और अपने ऑब्जेक्ट इंस्टेंस प्राप्त करने के लिए वैश्विक कार्यों का उपयोग करते हैं (जैसे अब, ब्याज दर प्रदाता)।
दुकान या तो हो सकती है:
- सख्ती से टाइप किया गया: आप सभी सर्व किए गए प्रकारों के लिए हेडर शामिल करते हैं और इसलिए आप टाइप किए गए एक्सेसर्स बना सकते हैं, जैसे InterestRate getCurrentInterestRate ();
- या सामान्य: ऑब्जेक्ट getObject (enum obType); और केवल नए प्रकार (obtypeCurrentInterestRate) के साथ obType Enum का विस्तार करें।
बड़ी प्रणाली, गलत एन्युम का उपयोग करने के काफी छोटे जोखिम के लिए, बाद के समाधान के लिए अधिक उपयोगी है। दूसरी ओर, भाषाओं के साथ जो आगे प्रकार की घोषणाओं की अनुमति देते हैं, मुझे लगता है कि आप स्टोर में सभी हेडर को शामिल किए बिना टाइप किए गए एक्सेसर्स का उपयोग कर सकते हैं।
एक और ध्यान दें: आपके पास विभिन्न उपयोगों के लिए एक ही ऑब्जेक्ट प्रकार के कई उदाहरण हो सकते हैं, जैसे कभी-कभी GUI के लिए अलग-अलग भाषा मूल्य और प्रिंटआउट, वैश्विक और सत्र स्तर लॉग आदि के लिए, इसलिए enum / accessor name को वास्तविक प्रकार को प्रतिबिंबित नहीं करना चाहिए , लेकिन अनुरोधित भूमिका (CurrentInterestRate) की भूमिका।
स्टोर कार्यान्वयन में, आपको संदर्भ स्तर और संदर्भ उदाहरण संग्रह को प्रबंधित करना होगा। एक सरल उदाहरण वेब सेवा है, जहां आपके पास वैश्विक संदर्भ है (उस ऑब्जेक्ट के सभी अनुरोधों के लिए एक उदाहरण - सर्वर फ़ार्म होने पर समस्याग्रस्त), और प्रत्येक वेब सत्र के लिए एक संदर्भ। आपके पास प्रत्येक उपयोगकर्ता के लिए संदर्भ भी हो सकते हैं, जिनके पास कई, समानांतर सत्र आदि हो सकते हैं। कई सर्वरों के साथ आपको ऐसी चीजों के लिए एक प्रकार के वितरित कैश का उपयोग करना चाहिए।
जब अनुरोध आता है, तो आप तय करते हैं कि अनुरोधित वस्तु किस संदर्भ स्तर पर है, कॉल के लिए उस संदर्भ को प्राप्त करें। यदि वस्तु है, तो आप इसे वापस भेजते हैं; यदि नहीं, तो आप इसे उस संदर्भ स्तर पर बनाते हैं और संग्रहीत करते हैं, और इसे वापस करते हैं। बेशक, सृजन अनुभाग को सिंक्रनाइज़ करें (और इसे वितरित कैश में प्रकाशित करें)। निर्माण विन्यास योग्य हो सकता है जैसे, भाषाओं के साथ सबसे अच्छा उनके वर्ग नाम (जावा, उद्देश्य सी, ...) द्वारा वस्तु उदाहरण बनाने की अनुमति देता है, लेकिन आप सी में प्लगगबल पुस्तकालयों के साथ कारखाने के कार्य कर सकते हैं।
साइड नोट: कॉलर को अपने स्वयं के संदर्भों और अनुरोधित ऑब्जेक्ट के संदर्भ स्तर के बारे में बहुत अधिक नहीं जानना चाहिए। कारण: 1: इन मापदंडों के साथ खेलने से गलती करना आसान है (या "चतुर चाल"); 2: अनुरोध का संदर्भ स्तर बाद में बदल सकता है। मैं ज्यादातर संदर्भ जानकारी को थ्रेड से जोड़ता हूं, इसलिए ऑब्जेक्ट स्टोर में अनुरोध से अतिरिक्त मापदंडों के बिना जानकारी है।
दूसरी ओर, अनुरोध में संकेत के लिए संकेत हो सकते हैं: जैसे किसी विशिष्ट तिथि के लिए ब्याज दर प्राप्त करना। यह एक ही "वैश्विक" पहुंच होना चाहिए, लेकिन तारीख के आधार पर कई उदाहरण हैं (और दर में परिवर्तन के बीच एक ही उदाहरण के लिए अलग-अलग तिथि मान), इसलिए अनुरोध द्वारा "संकेत" ऑब्जेक्ट को जोड़ना उचित है, जिसका उपयोग किया जाता है उदाहरण के कारखाने और दुकान नहीं; और एक keyForHint कारखाने के लिए, दुकान द्वारा इस्तेमाल किया। आप इन कार्यों को बाद में जोड़ सकते हैं, मैंने अभी उल्लेख किया है।
आपके मामले के लिए यह एक प्रकार का ओवरकिल है (वैश्विक स्तर पर केवल एक ही वस्तु परोसी जाती है), लेकिन अभी काफी छोटे और सरल अतिरिक्त कोड के लिए, आपको आगे, शायद अधिक जटिल आवश्यकताओं के लिए एक तंत्र मिलता है।
एक और अच्छी खबर: यदि आप जावा में हैं, तो आपको बहुत ज्यादा सोचे बिना बसंत से यह सेवा मिल जाती है, मैं बस इसे विस्तार से बताना चाहता था।