क्या आप कभी ऐसा वर्ग बनाना चाहते हैं जिसमें केवल एक उदाहरण हो?
हाँ? नहीं? शायद?
खैर…
ठीक यही सिंगलटन पैटर्न . है है।
इसमें कोई समस्या नहीं है।
लेकिन कुछ लोग इसे एक विरोधी पैटर्न कहते हैं क्योंकि इसे खराब डिज़ाइन के बहाने के रूप में इस्तेमाल किया जा सकता है।
आइए एक कोड उदाहरण देखें ताकि आप सीख सकें कि यह कैसे काम करता है।
सिंगलटन पैटर्न कोड उदाहरण
सिंगलटन पैटर्न का विचार यह है कि आप केवल एक उदाहरण वाली कक्षा चाहते हैं।
यहां बताया गया है :
- आप
newबनाते हैं विधि निजी - आप
instance. नामक एक वर्ग विधि को परिभाषित करते हैं जो कक्षा के लिए अद्वितीय उदाहरण देता है
क्योंकि यह एक लोकप्रिय डिज़ाइन पैटर्न है, रूबी मानक पुस्तकालय एक Singleton . के साथ आता है मॉड्यूल आप किसी भी कक्षा में शामिल कर सकते हैं।
ऐसा दिखता है :
require 'singleton' class Shop include Singleton end
अब अगर आप Shop . बनाने की कोशिश करते हैं ऑब्जेक्ट के साथ Shop.new आप इसे देखेंगे:
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 . से इनहेरिट करता है ।
जब आप एक AllType बनाते हैं instance . के माध्यम से वस्तु विधि, यह सुपर को कॉल करेगा और ऑब्जेक्ट को वापस कर देगा।
हर बार जब आप instance . पर कॉल करते हैं उसके बाद आपको वही ऑब्जेक्ट मिलेगा।
निष्कर्ष में :
हां, यह पैटर्न सही परिस्थितियों में उपयोगी हो सकता है, लेकिन आप इसके बारे में ज्यादा सोचे बिना इसका इस्तेमाल नहीं करना चाहते।
वीडियो
सारांश
आपने सिंगलटन डिज़ाइन पैटर्न के बारे में सीखा, इसे रूबी में कैसे लागू किया जाए और आपको ज्यादातर समय इससे क्यों बचना चाहिए।
आप इस पैटर्न के बारे में क्या सोचते हैं? क्या आपने इसे पहले देखा है? मुझे टिप्पणियों में बताएं 🙂
पढ़ने के लिए धन्यवाद!