2011-01-19 16 views
8

के रूप में मैंने जिम हिस्लोप और हर्ब सटर द्वारा आलेख Abstract Factory, Template Style पढ़ा। इस कारखाने को सिंगलटन के रूप में लागू किया गया है। उन्होंने RegisterInFactory सहायक वर्ग के साथ स्वचालित रूप से कक्षाओं को पंजीकृत करने का एक आसान तरीका प्रदान किया।जेनरिक फैक्ट्री सिंगलटन

अब मैंने कई बार पढ़ा है कि सिंगलेट्स से बचा जाना चाहिए, कुछ उन्हें एंटी-पैटर्न के रूप में भी मानते हैं और कुछ ऐसे मामले हैं जहां वे उपयोगी हैं। क्या यह उनमें से एक है? या क्या कोई वैकल्पिक दृष्टिकोण है जो कक्षाओं को स्वस्थ करने का इतना आसान तरीका प्रदान करता है?

+0

मुझे यह जानकर उत्सुकता है कि आप कहां से कहें कि "सिंगलेटन से बचा जाना चाहिए" ... – YeenFei

+0

"ग्लोबल वेरिएबल्स की तरह" सिंगलेट्स से बचा जाना चाहिए "। एक सार फैक्टरी एक वैश्विक सेवा की तरह है। प्रारंभिकरण (पंजीकरण) के बाद सभी क्लाइंट केवल इससे पढ़ते हैं (वस्तुओं के लिए पूछें)। मुझे लगता है कि सार फैक्टरी उन मामलों में से एक है जहां सिंगलटन उपयोगी है। – hansmaad

+0

यानी http://stackoverflow.com/questions/86582/singleton-how-should-it-be-used या http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827। एएसपीएक्स – P3trus

उत्तर

2

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

// in header 
class MyUsefulClass 
{ 
    public: 
    void doSomethingUseful(); 
}; 

// in .cpp 
MyUsefulClass::doSomethingUseful() 
{ 
    // ... 
    MyWonderfulService::instance().doService1(); 
    // ... 
    MyWonderfulService::instance().doService2(); 
} 

आप MyWonderfulService है कि अपने वर्ग के उपयोगकर्ताओं को लगता है कि नहीं कर सकते हैं के साथ एक युग्मन बनाने: इस तरह से आप तथ्य यह है कि आप अपने कार्यान्वयन में सेवा एक्स का उपयोग मुखौटा। इसके अलावा, आप नहीं आसानी से अपने उपयोगी वर्ग एक नकली सेवा के साथ कारण है कि मैं आम तौर पर dependancy inversion पसंद करते हैं परीक्षण कर सकते हैं ...

है कि:

// in header 
class MyUsefulClass 
{ 
    public: 
    void setServiceToUse(MyService&); 
    void doSomethingUseful(); 

    // [...] 
}; 

// in .cpp 
MyUsefulClass::doSomethingUseful() 
{ 
    // ... 
    _myService->doService1(); 
    // ... 
    _myService->doService2(); 
} 

इस तरह आम तौर पर युग्मन के बीच वर्ग हल्का होता है के रूप में बेहतर माना जाता है। फिर भी, कुछ सेवाओं के लिए, जो एक ढांचे में व्यापक रूप से उपयोग के लिए जाने जाते हैं, एक सिंगलटन का उपयोग करना आसान है। यह एक ही सेवा के लिए समझ में आता है जो सेवा है जो आपको ढांचे में अन्य सभी सेवाओं तक पहुंच प्रदान करती है उदाहरण के लिए ^^ यह अक्सर तकनीकी सेवाओं के लिए उपयोग की जाती है जैसे उदाहरण के लिए लॉगिंग।

my2c

संपादित करें: मैं, लेख को पढ़ने के रूप में ध्यान केंद्रित AbstractFactories पर, एक सिंगलटन का उपयोग एक आकस्मिक एक, नहीं एक डिजाइन निर्णय है। यह एक ऐसे लेख में समझ में आता है जिसमें आप ऐसी चीजें लिखना नहीं चाहते हैं जो आपको अपने बिंदु पर नहीं लाएंगे।

+0

इसलिए लेख में दिखाए गए ऑटोरेग्रिस्ट्रेशन के लिए मुझे वैश्विक पहुंच की आवश्यकता है, लेकिन मुझे इसे एकमात्र उदाहरण होने की आवश्यकता नहीं है। इसलिए एक विकल्प यह वैश्विक रूप में std :: cout जैसा प्रदान करेगा जो मुझे इसका उपयोग करने के लिए प्रेरित करता है, लेकिन यदि आवश्यक हो तो मुझे दूसरे का उपयोग करने से रोकें। या क्या इस तीसरे तरीके से, इस autoregistration प्राप्त करने के लिए शायद बेहतर तरीका है? – P3trus

+0

@ p3trus: मेरे पास समय है जब मैं अपने जवाब में एक ठोस उदाहरण जोड़ूंगा ... बस अभी के लिए एक वैश्विक कोशिश करें। मैं व्यक्तिगत रूप से depandancy उलटा उपयोग हर समय ... – neuro

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