2010-04-06 17 views
14

क्या कोई मुझे सिंगलटन पैटर्न का एक अच्छा उदाहरण बता सकता है? इसके अलावा मुझे यह पूछने में एक संदेह है, क्या निम्नलिखित परिदृश्य सिंगलटन पैटर्न का है:सिंगलटन पैटर्न का उदाहरण

जब हमारे पास लैन में जुड़े कई प्रिंटर हैं लेकिन केवल एक प्रिंटर कतार है?

+4

'विंडोज मीडिया प्लेयर' की कई विंडो खोलने का प्रयास करें, मुझे लगता है कि आप एक समय में केवल एक ही खोल सकते हैं, यह एक सिंगलटन है। – Rajat

+0

@all: इससे मुझे बहुत मदद मिली। बहुत बहुत धन्यवाद। :) – Supereme

उत्तर

7

Singleton एक सॉफ्टवेयर पैटर्न है।

Here सी # में एक उदाहरण है।

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

6

एकमात्र प्रयोग करने के लिए मेरा व्यक्तिगत नियम यह है कि केवल जब यह वहाँ के लिए एक त्रुटि है एक से अधिक उदाहरण होने की आदत हो, और वैश्विक पहुँच है आवश्यक है। मैं कहूंगा कि एक प्रिंट कतार सिंगलटन के लिए एक अच्छा उम्मीदवार नहीं है: क्योंकि आपको वैश्विक पहुंच की आवश्यकता नहीं है, और यह भी तर्कसंगत है कि यह एक से अधिक होने में त्रुटि है। वास्तव में, जबकि वहाँ एक "भौतिक" प्रिंट कतार हो सकता है (उदाहरण के लिए कहीं न कहीं एक प्रिंट सर्वर पर) है कि क्या आवेदन के बारे में, यह सिर्फ "नौकरियों" प्रस्तुत करने के लिए की जरूरत है परवाह करता है नहीं है:

PrintJobScheduler pjs; 
pjs.SubmitPrintJob(myPrintJob); 

आप की जरूरत नहीं है मेरे काल्पनिक PrintJobScheduler एक सिंगलटन होने के लिए, भले ही यह नेटवर्क पर कहीं भी "सिंगलटन" सेवा से बात कर रहा हो।

1

सिंगलटन पैटर्न वस्तु निर्माण को नियंत्रित करता है। यह गारंटी देता है कि किसी भी समय पर केवल 1 वस्तु मौजूद है। इसे कार्यान्वित करना आसान है लेकिन खतरनाक हो सकता है।

  1. ऐसी वस्तुओं का जीसी मुश्किल है।
  2. मुश्किल परीक्षण करने के लिए

मुझे नहीं लगता कि प्रिंटर कतार एक सिंगलटन पैटर्न है।

1

मैंने देखा है कि सिंगलटन पैटर्न के सर्वोत्तम उदाहरणों (वास्तविक जीवन में) में से एक है .NET में एसक्यूएल कनेक्शन पूलिंग।

यदि आप कोड देखना चाहते हैं, तो आपको खुले परावर्तक को पॉप करना होगा ... लेकिन सिंगलटन सभी उपलब्ध कनेक्शनों का ट्रैक रखता है और उपलब्ध होने पर उन्हें बाहर रखता है।

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

+0

व्यक्तिगत रूप से, और वास्तव में .NET SQL कनेक्शन पूलिंग के बिना, मैं अलग-अलग डेटाबेस, अलग-अलग एक्सेस मोड (केवल पढ़ने, पढ़ने/लिखने) और उपयोगकर्ताओं, और यहां तक ​​कि विभिन्न प्राथमिकताओं के लिए अलग-अलग पूल रखना पसंद करता हूं। तो: पूल का एक सेट, यानी कोई सिंगलटन नहीं। – digitalarbeiter

4

सिंगलटन के पीछे सामान्य विचार यह है कि यह एक ऐसा ऑब्जेक्ट है जिसके लिए इसे एक से अधिक होने का कोई मतलब नहीं है, और जिसे आपके पूरे कार्यक्रम में एक्सेस करने की आवश्यकता हो सकती है।

जो मैं हर समय उपयोग करता हूं वह एक प्रोग्राम है कॉन्फ़िगरेशन

मेरे कॉन्फ़िगरेशन सिंगलेट्स में से एक सामान्य में आईपी पते, डिवाइस नाम और सिस्टम सीमाएं जैसी चीज़ें शामिल होंगी। जब पहली बार कॉल किया जाता है, तो यह आमतौर पर कॉन्फ़िगरेशन फ़ाइल (कभी-कभी और/या विंडोज़ पर सिस्टम रजिस्ट्री) को पढ़ेगा, और वहां पाए गए आइटमों के लिए डिफ़ॉल्ट मानों में लोड नहीं होगा। यह वास्तव में एक प्रोग्राम के लिए एकाधिक विन्यास के लिए कोई समझ नहीं आता है, इसलिए पूरे सभी कार्यक्रमों के लिए इन सभी चीजों को एक बार में पढ़ा जाना चाहिए। इसके अतिरिक्त, सिस्टम में कॉन्फ़िगरेशन आइटम्स को अन्य सभी प्रकार के असंबद्ध वर्गों द्वारा एक्सेस करने की आवश्यकता हो सकती है।

+0

मुझे लगता है कि इस प्रकार के परिदृश्य में स्थिर कीवर्ड अधिक सहायक है। क्या आप कहते हैं? –

+0

@NIVESHSENGAR - वाकई, मैं उन लोगों के पक्ष में उतरना शुरू कर दिया हूं जो मानते हैं कि सिंगलटन एक विरोधी पैटर्न है। (http://caines.ca/blog/programming/singletons-anti-pattern-or-worst-anti-pattern-ever/) अब मैं मुख्य प्रोग्राम के स्वामित्व वाले कॉन्फ़िगरेशन ऑब्जेक्ट्स बनाना चाहता हूं और ऑब्जेक्ट में बनाया गया है जिसके लिए उन्हें आवश्यकता है । –

2

एक HTTP प्रतिक्रिया एक अच्छा उदाहरण हो सकता है। आप दो या दो से अधिक उदाहरणों को विरोधाभासी हेडर भेजना नहीं चाहते हैं।

4

गेम डिज़ाइन में, यदि आपके पास ग्राफिक्स डिवाइस हैंडल या समान हार्डवेयर अबास्ट्रक्शन है जो प्रतिपादन या ऑडियो जैसे संसाधन के लिए ज़िम्मेदार है, तो यह सिंगलटन होना चाहिए।

कम से कम that's what I was told.

2
class Singleton 
{ 
    #region Subj Implementation 

    private Singleton() { } 
    private static readonly Lazy<Singleton> _lazyInit = new Lazy<Singleton> 
     (() => new Singleton()); 
    public static Singleton Instance { get { return _lazyInit.Value; } } 

    #endregion 
} 
2

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

2

सिंगलटन पैटर्न पर this आलेख में दिए गए कुछ उदाहरण।

+2

ध्यान दें कि लिंक-केवल उत्तर निराश होते हैं, इसलिए SO समाधान एक समाधान के लिए खोज का अंत बिंदु होना चाहिए (बनाम अभी तक संदर्भों का एक और स्टॉपओवर, जो समय के साथ पुराना हो जाता है)। लिंक को संदर्भ के रूप में रखते हुए, यहां स्टैंड-अलोन सारांश जोड़ना पर विचार करें। – kleopatra

+1

दिया गया यूआरएल काम नहीं कर रहा है। मैं दृढ़ता से सुझाव देता हूं कि इस पर क्लिक न करें। – arsho

-1
class singleton{ 

    public static singleton obj = null;  
    protected singleton(){ } 

    public static singleton getObj(){   
     if(obj == null){     
       obj = new singleton();    
      }   
     return obj;  
    }  
} 

public class First { 
    public static void main(String[] args) {  
     singleton ss = singleton.getObj();  
    } 
} 
संबंधित मुद्दे