दिलचस्प पोस्ट
एएआर को जार में कैसे परिवर्तित करें PHP में एक फ़ंक्शन द्वारा पहुंच सरणी वापस आ गया रेज़र दृश्य सिस्टम नहीं देख रहा है। Web.Mv.HtmlHelper जावा में बहु-थ्रेडेड वातावरण में स्थैतिक पद्धति व्यवहार सुपर () जावा में एक पूर्ण स्क्रीन मोड में शीर्षक छुपा रहा है? MySQL में तारीख श्रेणियों के ओवरलैप की जांच करें जावा के लिए एक हेप विश्लेषण उपकरण की सिफारिशें? कैसे सी # ज़िप में दो से अधिक सामान्य सूचियों को गठबंधन करने के लिए? पॉ () फ़ंक्शन का उपयोग सी में अनिर्धारित संदर्भ त्रुटि फेंकता है क्या भविष्य और मानचित्र के बीच अंतर है? सी # विरंजन समस्या: निर्दिष्ट सूची <Derived> as as List <Base> System.out.println () द्वारा कंसोल करने के लिए मुद्रित सामग्री को कैसे हटाएं? कैसे एक node.js एप से exe फ़ाइलें बनाने के लिए? असहनीय रूप से धीमी एंड्रॉइड एमुलेटर – क्या कोई तय है?

जावा कोड में एक सिंगलटन पैटर्न को लागू करना (कभी-कभी) जावा की दुनिया में एक विरोधी-पैटर्न माना जाता है?

मैंने कुछ लोगों को ऐसा टिप्पणी करते हुए देखा है कि सिंगलटन पैटर्न एक विरोधी-पैटर्न है। मैं जानना चाहता हूं क्यो ?

Solutions Collecting From Web of "जावा कोड में एक सिंगलटन पैटर्न को लागू करना (कभी-कभी) जावा की दुनिया में एक विरोधी-पैटर्न माना जाता है?"

परिक्षण

एक कारण यह है कि यूनिट परीक्षणों के साथ सिंगलटन आसान नहीं हैं। आप तात्कालिकता को नियंत्रित नहीं कर सकते और उनके स्वभाव से इनवोकेशन में राज्य को बनाए रख सकते हैं।

इस कारण से निर्भरता इंजेक्शन का सिद्धांत लोकप्रिय है। प्रत्येक कक्षा को उन कक्षाओं के साथ इंजेक्शन (कॉन्फ़िगर किया गया है) जिन्हें वे कार्य करने की आवश्यकता होती है (सिंगलटन एक्सेसर्स के माध्यम से प्राप्त करने के बजाय) और इसलिए परीक्षणों को नियंत्रित क्लास इंस्टेंसेस को नियंत्रित करने के लिए नियंत्रित कर सकते हैं (और आवश्यकतानुसार मोजे प्रदान करते हैं)।

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

उदाहरण के बजाय (उदाहरण के लिए)

public class Portfolio { private Calculator calc = Calculator.getCalculator(); } 

आप कैलकुलेटर इंजेक्षन करेंगे:

 public class Portfolio { public Portfolio(Calculator c) { this.calc = c; } } 

इस प्रकार Portfolio ऑब्जेक्ट Calculator कितने उदाहरणों के बारे में नहीं जानते / देखभाल करते हैं टेस्ट एक डमी Calculator इंजेक्ट कर सकता है जो परीक्षण आसान बनाते हैं।

संगामिति

अपने आप को किसी वस्तु के एक उदाहरण में सीमित करके, थ्रेडिंग के विकल्प सीमित हैं। सिंगलटन ऑब्जेक्ट तक पहुंच की आवश्यकता हो सकती है (जैसे सिंक्रनाइज़ेशन के माध्यम से) यदि आप उन ऑब्जेक्ट्स के कई उदाहरण बनाए रख सकते हैं, तो आप अपने चलने वाले थ्रेड्स में उदाहरणों की संख्या दर्ज़ कर सकते हैं, और अपने कोडेबेस की समवर्ती क्षमताओं को बढ़ा सकते हैं।

मेरी व्यक्तिगत राय यह है कि वह एकल जिम्मेदारी सिद्धांत का उल्लंघन करती है। सिंगलटन ऑब्जेक्ट दोनों अपने उद्देश्य के लिए जिम्मेदार हैं और उन उदाहरणों की संख्या को नियंत्रित करते हैं जो मुझे लगता है कि गलत है।

यही कारण है कि बहुत से लोग फ़ैक्टरी ऑब्जेक्ट पर नियंत्रण का प्रतिनिधि करते हैं

[उत्परिवर्तनीय] सिंगलटन एक विरोधी-पैटर्न का एक विरोधी-पैटर्न है

महत्वपूर्ण अंतर्निहित विरोधी पैटर्न वैश्विक राज्य है (या परिवेशी राज्य) वैश्विक स्थिति के साथ आपके पास अपने कार्यक्रम में निर्भरता का एक बड़ा ब्लॉग है। यह परीक्षण को प्रभावित करता है, लेकिन यह खराब प्रोग्रामिंग से नतीजे का सिर्फ एक हिस्सा है।

उस पर स्तरित, सिंगलटन केवल अस्थिर static क्षेत्रों को घोषित करने पर जटिलता का पूरी तरह से अनावश्यक स्तर जोड़ता है।

जैसे सिंगलटन अनिवार्य रूप से एक विरोधी-पैटर्न नहीं हैं, लेकिन उनके पास केवल कुछ लाभ हैं और जब उन्हें गलत इस्तेमाल किया जाता है (जो अक्सर होता है) बन जाता है।

प्रायः, एकल गीत अकेले नहीं, बल्कि "भेष में वैश्विक चर" हैं इसके अलावा, अक्सर इसका उपयोग तब किया जाता है जब "केवल एक उदाहरण" संपत्ति वास्तव में एक लाभ नहीं होती है (जो फिर से इस तथ्य से संतुलित है कि कई बार कार्यान्वयन एक ही समय में गलत है)

इसके अतिरिक्त, वे मल्टीथ्रेडिंग को ध्यान में रखना मुश्किल हो सकते हैं (अक्सर गलत या अक्षमता से किया जाता है), और यदि आप अपने तत्काल नियंत्रण को नियंत्रित करना चाहते हैं, तो वे अपने अधिकांश लाभ खो देते हैं।

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

आपके पास सिंगलटन पर बहुत सी आवश्यकताएं हैं:

  1. आलसी आरम्भिकरण;
  2. उचित निपटान;
  3. scoping (उदाहरण के लिए, प्रति धागा प्रति)

सामान्यतया, यह भी कि आपके पास आपके ऐप में सिंगलटन का एक बहुत कुछ होगा, और सिंगलटन पैटर्न पुन: प्रयोज्य कोड की अनुमति नहीं देता है। इसलिए, यदि आप अपने सभी गीतकारों के लिए इन सभी चिंताओं को लागू करना चाहते हैं, तो आप तुरंत इसकी विरोधी-पैटर्न की गुणवत्ता देखेंगे

अजीब। ऐसा लगता है कि सिंगलटन के गलत कार्यान्वयन एक "विरोधी-पैटर्न" है, न कि सिंगलटन ही।

मुझे लगता है हम भूल गए हैं कि हर प्रोग्राम को कहीं शुरू करना है। हर अमूर्त के ठोस कार्यान्वयन होना चाहिए, और अंततः हर निर्भरता अंततः हल हो जाएगी या आपके ऐप का ज्यादा उपयोग नहीं होगा।

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

आईएमओ, वहाँ से बाहर हर दूसरे पैटर्न की तरह (डीआई और आईओसी सहित) यह एक उपकरण है कभी-कभी यह फिट बैठता है, कभी कभी ऐसा नहीं होता है