2012-11-02 14 views
35

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

// initialize singleton during app boot 
[MKStoreManager sharedManager] 

// sometime later in the app 
[[MKStoreManager sharedManager] buyFeature:kFeatureAId 
           onComplete:^(NSString* purchasedFeature) 
{ 
    NSLog(@"Purchased: %@", purchasedFeature); 
} 
           onCancelled:^ 
{ 
    NSLog(@"User Cancelled Transaction"); 
}]; 

या वैकल्पिक रूप से NSUserDefaults, UIApplication आदि .. अन्य दृष्टिकोण MagicalRecord में या यहाँ पार्स एपीआई के साथ देखा जा सकता है: उदाहरण के लिए, यहाँ MKStoreKit में प्रयोग किया जाता पूर्व दृष्टिकोण है

कुछ
// configure API credentials sometime during app boot 
[Parse setApplicationId:@"123456" 
       clientKey:@"123456"]; 

// sometime later 
PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; 
[testObject setObject:@"bar" forKey:@"foo"]; 
[testObject save]; 

क्या हैं दो दृष्टिकोणों के पेशेवरों और विपक्ष और उनमें से एक मूल रूप से दूसरे की तुलना में बेहतर है?

साझा उदाहरण को पुनर्प्राप्त करने के लिए कुछ स्क्रीन एस्टेट सहेजना नहीं है (प्रदर्शन अंतर संभवतः अप्रासंगिक है), लेकिन क्या मैं खुद को किसी अन्य तरीके से खराब कर रहा हूं, उदाहरण के लिए, टेस्टेबिलिटी-वार?

धन्यवाद!

उत्तर

27

वहाँ दृष्टिकोण को लागू करने के दो अलग अलग तरीकों वर्ग तरीकों के आधार पर कर रहे हैं:

  • एक वर्ग हर कोई से छिपा का उपयोग कर एक सिंगलटन उदाहरण है, और समान हस्ताक्षरों के साथ आवरण वर्ग के तरीकों के पीछे अपने तरीकों छुपाने के लिए, या
  • मेक वर्ग तरीकों कि सभी काम कर

पहले कार्यान्वयन के निहितार्थ है कि सब कुछ आप एक सिंगलटन के साथ कर सकते हैं, तो आप छिपा सिंगलटन के साथ कर सकते हैं:

0,123,
  • एक उपवर्ग का उपयोग कर एक संभावना
  • रन के बीच में उदाहरण के लिए स्विचन हो जाता है आसान
  • उदाहरण चर में राज्य जीवन है
  • प्रारंभ यदि आप परिचित पैटर्न

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

पहले कार्यान्वयन का परीक्षण दूसरे की तुलना में कुछ आसान है, क्योंकि आप परीक्षण के लिए सिंगलटन का एक अलग कार्यान्वयन प्रदान कर सकते हैं, शायद पीछे के दरवाजे के माध्यम से; एक स्थिर आधारित कार्यान्वयन के साथ, इस मार्ग को नहीं लिया जा सकता है।

संक्षेप में, मैं सिंगलटन-आधारित समाधान का उपयोग करूंगा, सिंगलटन वैकल्पिक रूप से "मुखौटा" के पीछे छिपा हुआ है जो सिंगलटन के तरीकों तक पहुंच प्रदान करता है। मैं एक कार्यान्वयन का उपयोग नहीं करता जहां सभी राज्य स्थिर चर में रखा जाना चाहिए।

+1

ग्रेट उत्तर, धन्यवाद! –

+0

अच्छा जवाब लेकिन एक छोटा सा उदाहरण इसे समझने के लिए और अधिक आसान बना देगा। – atulkhatri

7

सिंगलटन दृष्टिकोण का एक लाभ यह है कि यदि आपको आवश्यकता हो तो अन्य उदाहरणों को अनुमति देने के लिए यह छोटा हो जाता है। यदि आप कक्षा विधि दृष्टिकोण लेते हैं, तो आपको बहुत सारे रिफैक्टरिंग के बिना मिलता है।

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