क्या आपने कभी एक ऐसी क्लास बनाना चाहा है जिसका केवल एक इंस्टेंस हो सकता है?
हां? नहीं? शायद?
खैर…
यही सिंगलटन पैटर्न है।
इसमें कोई समस्या नहीं है।
लेकिन कुछ लोग इसे एंटी-पैटर्न कहते हैं क्योंकि इसका उपयोग खराब डिज़ाइन के बहाने के रूप में किया जा सकता है।
आइए एक कोड उदाहरण देखें ताकि आप सीख सकें कि यह कैसे काम करता है।
सिंगलटन पैटर्न कोड उदाहरण
सिंगलटन पैटर्न का विचार यह है कि आप एक क्लास चाहते हैं जिसका केवल एक इंस्टेंस हो।
यहां कैसे:
- आप
newमेथड को प्राइवेट बनाते हैं - आप
instanceनामक एक क्लास मेथड परिभाषित करते हैं जो क्लास के लिए अद्वितीय इंस्टेंस लौटाता है
क्योंकि यह एक लोकप्रिय डिज़ाइन पैटर्न है, रूबी स्टैंडर्ड लाइब्रेरी एक Singleton मॉड्यूल के साथ आती है जिसे आप किसी भी क्लास में शामिल कर सकते हैं।
यह ऐसा दिखता है:
require 'singleton' class Shop include Singleton end
अब यदि आप Shop.new के साथ एक Shop ऑब्जेक्ट बनाने का प्रयास करते हैं तो आप यह देखेंगे:
Shop.new # NoMethodError: private method `new' called for Shop:Class
और यदि आप एकमात्र Shop ऑब्जेक्ट प्राप्त करना चाहते हैं तो आप instance मेथड का उपयोग कर सकते हैं:
Shop.instance.object_id # 5659218 Shop.instance.object_id # 5659218
आप बता सकते हैं कि यह हमेशा वही ऑब्जेक्ट है क्योंकि object_id कभी नहीं बदलता।
आपको क्या याद रखने की आवश्यकता है:
यह एक सरल पैटर्न है, यह ऑब्जेक्ट निर्माण को 1 ऑब्जेक्ट तक सीमित करता है और आप जब चाहें उस ऑब्जेक्ट का अनुरोध कर सकते हैं।
आपको इस पैटर्न का उपयोग क्यों नहीं करना चाहिए
सिंगलटन पैटर्न अक्सर किसी प्रकार के ग्लोबल वेरिएबल का बहाना होता है और हम जानते हैं कि ग्लोबल वेरिएबल खराब हैं क्योंकि आपका उन पर कोई नियंत्रण नहीं होता। यह चीजों को टेस्ट करना कठिन बनाता है और कपलिंग बढ़ा सकता है।
"सिंगलटन के साथ वास्तविक समस्या यह है कि वे आपको किसी ऑब्जेक्ट की उपयुक्त दृश्यता के बारे में सावधानी से न सोचने का इतना अच्छा बहाना देते हैं।" — केंट बेक
एक ऐसी वस्तु की कल्पना करें जिस पर आपकी अधिकांश क्लासेस निर्भर करती हैं, यही सिंगलटन पैटर्न बन सकता है। उसे रीफैक्टर करने के लिए शुभकामनाएं!
अब:
क्या इस पैटर्न के कोई अच्छे उपयोग हैं?
गिटहब पर खोज करने पर नल ऑब्जेक्ट पैटर्न के साथ संयोजन में सिंगलटन पैटर्न का उपयोग करने वाले कुछ रेपो मिले।
मुझे लगता है कि यह समझ में आता है, रेल्स इसे एक्शनपैक के हिस्से के रूप में उपयोग करता है।
यहां कोड है:
class AllType < Type include Singleton def initialize super "*/*", :all end def all?; true; end def html?; true; end end
यह एक क्लास है जो Type से विरासत में मिली है।
जब आप instance मेथड के माध्यम से एक AllType ऑब्जेक्ट बनाते हैं, तो यह सुपर को कॉल करेगा और ऑब्जेक्ट लौटाएगा।
उसके बाद हर बार जब आप instance कॉल करते हैं तो आपको वही ऑब्जेक्ट मिलेगा।
निष्कर्ष में:
हां, यह पैटर्न सही स्थितियों में उपयोगी हो सकता है, लेकिन आप इसके बारे में बहुत सोचे बिना इसका उपयोग नहीं करना चाहते।
वीडियो
सारांश
आपने सिंगलटन डिज़ाइन पैटर्न के बारे में सीखा, इसे रूबी में कैसे लागू करें और क्यों आपको इससे ज्यादातर समय बचना चाहिए।
आप इस पैटर्न के बारे में क्या सोचते हैं? क्या आपने इसे पहले देखा है? मुझे कमेंट्स में बताएं 🙂
पढ़ने के लिए धन्यवाद!