2012-01-02 18 views
8

मैं एक सर्वर चला रहा हूं जिसे अवसर पर क्लाइंट प्रश्नों को खोजना है। मैं रिकॉर्ड्स के लिए डिस्क पर क्लाइंट क्वेरी लिखना चाहता हूं, लेकिन मैं अब खोज से धीमा नहीं करना चाहता हूं। (खोज पहले से ही बाधा है ...)सिंगलटन डिज़ाइन पैटर्न का उचित उपयोग करके

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

मेरे यहां एक वैचारिक प्रश्न है: क्या इस मामले में सिंगलटन उपयुक्त है? मैं अपने हालिया प्रोग्रामिंग में सिंगलटन डिज़ाइन पैटर्न का थोड़ा अधिक उपयोग कर रहा हूं, और मैं यह सुनिश्चित करना चाहता हूं कि मैं इसे अपने इच्छित उपयोग के लिए उपयोग कर रहा हूं।

किसी भी प्रतिक्रिया की बहुत सराहना की जाती है।

+3

अपने संपूर्ण वास्तुकला को देखे बिना इस प्रश्न का उत्तर देना मुश्किल है। सिंगलटन पैटर्न में कमी आई है (यूनिट-परीक्षण कठिनाइयों आदि का कारण बनता है), यह निर्धारित करने के लिए आप पर निर्भर हैं कि वे प्रासंगिक हैं या नहीं ... –

+1

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

+0

वैश्विक स्थिति का अस्तित्व निर्भरताओं को इंजेक्ट करना मुश्किल बना सकता है (यह [नकली परीक्षण] का आधार है (http://en.wikipedia.org/wiki/Mock_object))। अधिक जानकारी के लिए इस बात को देखें: http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html। –

उत्तर

7

singleton pattern निश्चित रूप से overused है और (विहित उदाहरण है इकाई परीक्षण) difficulties के अपने हिस्से के साथ आता है, लेकिन डिजाइन में सब कुछ की तरह, आप अपने विशिष्ट परिदृश्य के लिए पक्ष-विपक्ष वजन की जरूरत है। सिंगलटन पैटर्न में इसका उपयोग होता है। ऐसे विकल्प हैं जो आपको कुछ अंतर्निहित मुद्दों को कम करते हुए सिंगलटन व्यवहार प्राप्त करने की अनुमति दे सकते हैं:

Interception (जिसे अक्सर पहलू उन्मुख प्रोग्रामिंग के रूप में जाना जाता है, हालांकि मैंने बहस देखी है कि वे बिल्कुल वही चीज़ नहीं हैं। .. इस समय मैंने जिस लेख को पढ़ा है उसे नहीं मिला) निश्चित रूप से एक विकल्प है। आप निर्माण इंजेक्शन के किसी भी संयोजन, decorator पैटर्न, एक अमूर्त कारखाना और inversion of control container का उपयोग कर सकते हैं। मैं अपने जावा आईओसी कंटेनरों पर नहीं हूं, लेकिन कुछ नेट कंटेनर हैं जो स्वत: अवरोध की अनुमति देते हैं (मुझे लगता है कि Spring.Net करता है, इसलिए संभवतः स्प्रिंग (जावा) ने इसे बनाया है)। यह किसी भी प्रकार की क्रॉस-कटिंग चिंताओं के लिए बहुत आसान है, जहां आपको कई परतों (सुरक्षा, लॉगिंग इत्यादि) में कुछ प्रकार के कार्यों को करने की आवश्यकता है। इसके अलावा, अधिकांश आईओसी कंटेनर आपको आजीवन प्रबंधन को नियंत्रित करने की अनुमति देते हैं, इसलिए आप वास्तव में सिंगलटन पैटर्न को मैन्युअल रूप से कार्यान्वित किए बिना, अपने लॉगर को सिंगलटन के रूप में पेश करने में सक्षम होंगे।

इसे समेटने के लिए। यदि एक सिंगलटन आपके परिदृश्य के लिए फिट बैठता है (आपके विवरण से व्यवहार्य लगता है), इसके लिए जाएं। बस सुनिश्चित करें कि आपने पेशेवरों और विपक्षों का वजन कम किया है। आप एक अलग दृष्टिकोण की कोशिश कर सकते हैं और दोनों की तुलना कर सकते हैं।

संबंधित मुद्दे