design patterns स्थिर वर्ग और सिंगलटन पैटर्न के बीच अंतर?




design-patterns static (24)

कई मामलों में, इन दोनों में कोई व्यावहारिक अंतर नहीं होता है, खासकर यदि सिंगलटन इंस्टेंस कभी भी बदलता या परिवर्तन नहीं करता है जैसे कि कॉन्फ़िगरेशन होल्डिंग।

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

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

एक स्थिर वर्ग और एक सिंगलटन पैटर्न के बीच क्या असली (यानी व्यावहारिक) अंतर मौजूद है?

दोनों को तत्काल बिना बुलाया जा सकता है, दोनों केवल एक "इंस्टेंस" प्रदान करते हैं और उनमें से कोई भी थ्रेड-सुरक्षित नहीं है। क्या कोई और अंतर है?


When I want class with full functionality, eg there are many methods and variables, I use singleton;

If I want class with only one or two methods in it, eg MailService class, which has only 1 method SendMail() I use static class and method.


सिंगलटन परिप्रेक्ष्य परीक्षण से बेहतर दृष्टिकोण है। स्थिर वर्गों के विपरीत, सिंगलटन इंटरफेस को कार्यान्वित कर सकता है और आप नकली उदाहरण का उपयोग कर सकते हैं और उन्हें इंजेक्ट कर सकते हैं।

नीचे दिए गए उदाहरण में मैं इसे समझाऊंगा। मान लें कि आपके पास एक विधि है GoodPrice () जो एक विधि getPrice () का उपयोग करता है और आप सिंगलटन में विधि के रूप में getPrice () को लागू करते हैं।

सिंगलटन जो getPrice कार्यक्षमता प्रदान करता है:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

GetPrice का उपयोग:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

अंतिम सिंगलटन कार्यान्वयन:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

परीक्षा वर्ग:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

अगर हम GetPrice () को लागू करने के लिए स्थिर विधि का उपयोग करने का विकल्प लेते हैं, तो नकली getPrice () को मुश्किल करना मुश्किल था। आप पावर मॉक के साथ स्थैतिक नकल कर सकते हैं, फिर भी सभी उत्पाद इसका उपयोग नहीं कर सकते हैं।


एक स्थैतिक वर्ग वह होता है जिसमें केवल स्थैतिक विधियां होती हैं, जिसके लिए एक बेहतर शब्द "कार्य" होगा। एक स्थिर वर्ग में अवशोषित डिजाइन शैली पूरी तरह से प्रक्रियात्मक है।

दूसरी ओर, सिंगलटन, ओओ डिजाइन के लिए विशिष्ट पैटर्न है। यह किसी ऑब्जेक्ट का एक उदाहरण है (उसमें अंतर्निहित सभी संभावनाओं के साथ, जैसे कि पॉलिमॉर्फिज्म), एक सृजन प्रक्रिया के साथ यह सुनिश्चित करता है कि पूरे जीवनकाल में उस विशेष भूमिका का केवल एक उदाहरण है।


  1. सिंगलटन ऑब्जेक्ट्स हीप में संग्रहीत होते हैं, लेकिन स्थैतिक वस्तुएं ढेर में संग्रहित होती हैं।
  2. हम क्लोन कर सकते हैं (यदि डिजाइनर ने इसे अस्वीकार नहीं किया है) सिंगलटन ऑब्जेक्ट, लेकिन हम स्थिर वर्ग ऑब्जेक्ट को क्लोन नहीं कर सकते हैं।
  3. सिंगलटन कक्षाएं ओओपी (वस्तु उन्मुख सिद्धांतों) का पालन करती हैं, स्थैतिक कक्षाएं नहीं होती हैं।
  4. हम सिंगलटन कक्षा के साथ एक interface को कार्यान्वित कर सकते हैं, लेकिन एक वर्ग की स्थैतिक विधियां (या उदाहरण के लिए सी # static class ) नहीं कर सकती हैं।

सच्चे उत्तर जॉन स्कीट द्वारा यहां एक और मंच पर है

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

एक स्थैतिक वर्ग केवल स्थिर तरीकों की अनुमति देता है।


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


एक उल्लेखनीय अंतर अलग-अलग तत्काल है जो सिंगलेट्स के साथ आता है।

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


मैंने निम्नलिखित पढ़ा और सोचते हैं कि यह भी समझ में आता है:

आपके व्यवसाय का ख्याल करना

याद रखें, सबसे महत्वपूर्ण ओओ नियमों में से एक यह है कि एक वस्तु स्वयं के लिए ज़िम्मेदार है। इसका मतलब है कि कक्षा के जीवन चक्र से संबंधित मुद्दों को कक्षा में संभाला जाना चाहिए, न कि स्थैतिक जैसी भाषा संरचनाओं को सौंपा गया है, और इसी तरह।

ऑब्जेक्ट-ओरिएंटेड थॉट प्रोसेस 4 वें एड पुस्तक से।


यहां एक अच्छा लेख है: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

स्टेटिक कक्षाएं

एकाकी वस्तु

संक्षेप में, मैं केवल उपयोग विधियों को रखने के लिए स्थिर वर्गों का उपयोग करता हूं, और अन्य सभी चीज़ों के लिए सिंगलटन का उपयोग करता हूं।

संपादित करता


आप क्या कहते हैं कि या तो सिंगलटन या स्थैतिक विधि थ्रेड-सुरक्षित नहीं है? आम तौर पर दोनों को थ्रेड-सुरक्षित होने के लिए लागू किया जाना चाहिए

सिंगलटन और स्थिर तरीकों का एक समूह के बीच बड़ा अंतर यह है कि सिंगलटन इंटरफेस को लागू कर सकते हैं (या उपयोगी आधार वर्गों से प्राप्त होते हैं, हालांकि यह मेरे अनुभव में कम आम है), ताकि आप सिंगलटन के चारों ओर पास कर सकें जैसे कि यह "बस एक और "कार्यान्वयन।


  • सी # में एक स्थिर वर्ग एक इंटरफेस लागू नहीं कर सकता है। जब किसी एक इंस्टेंस क्लास को कुछ व्यावसायिक कारणों या आईओसी उद्देश्यों के लिए इंटरफ़ेस को कार्यान्वित करने की आवश्यकता होती है, तो आप स्टैटिक क्लास के बिना सिंगलटन पैटर्न का उपयोग कर सकते हैं।
  • आप सिंगलटन की वस्तु को क्लोन कर सकते हैं, लेकिन आप स्थैतिक वर्ग ऑब्जेक्ट को क्लोन नहीं कर सकते हैं
  • हीप में सिंगलटन ऑब्जेक्ट स्टोर्स, लेकिन स्थिर ऑब्जेक्ट स्टोर्स स्टैक में
  • एक सिंगलटन को आलसी या असीमित रूप से प्रारंभ किया जा सकता है, जबकि एक स्थिर वर्ग आमतौर पर पहली बार लोड होने पर प्रारंभ होता है

खैर एक सिंगलटन सिर्फ एक सामान्य वर्ग है जो तत्काल है लेकिन क्लाइंट कोड से केवल एक बार और परोक्ष रूप से। स्टेटिक क्लास तत्काल नहीं है। जहां तक ​​मुझे स्थिर तरीकों को पता है (स्थैतिक वर्ग में स्थिर विधियां होनी चाहिए) गैर स्थैतिक से तेज हैं।

संपादित करें:
FxCop प्रदर्शन नियम विवरण: "विधि जो आवृत्ति डेटा या कॉल आवृत्ति विधियों तक नहीं पहुंचती हैं उन्हें स्थिर (वीबी में साझा किया जा सकता है) के रूप में चिह्नित किया जा सकता है। ऐसा करने के बाद, कंपाइलर इन सदस्यों को गैर वर्चुअल कॉल साइट्स उत्सर्जित करेगा जो चेक को रोक देंगे वर्तमान ऑब्जेक्ट पॉइंटर को बीमा करने वाले प्रत्येक कॉल के लिए रनटाइम गैर-शून्य है। इसके परिणामस्वरूप प्रदर्शन-संवेदनशील कोड के लिए एक मापनीय प्रदर्शन लाभ हो सकता है। कुछ मामलों में, वर्तमान ऑब्जेक्ट इंस्टेंस तक पहुंचने में विफलता एक शुद्धता समस्या का प्रतिनिधित्व करती है। "
मुझे वास्तव में पता नहीं है कि यह स्थिर वर्गों में स्थिर तरीकों पर भी लागू होता है।


  1. धीरे लोड हो रहा है
  2. इंटरफेस का समर्थन, ताकि अलग कार्यान्वयन प्रदान किया जा सके
  3. व्युत्पन्न प्रकार को वापस करने की क्षमता (lazyloading और इंटरफ़ेस कार्यान्वयन के संयोजन के रूप में)

सिंगलटन पैटर्न में स्थिर वर्गों पर कई फायदे हैं। सबसे पहले, एक सिंगलटन कक्षाओं का विस्तार कर सकता है और इंटरफेस को कार्यान्वित कर सकता है, जबकि एक स्थिर वर्ग नहीं कर सकता है (यह कक्षाओं का विस्तार कर सकता है, लेकिन यह उनके इंस्टेंस सदस्यों का वारिस नहीं करता है)। एक सिंगलटन को आलसी या असीमित रूप से प्रारंभ किया जा सकता है, जबकि एक स्थिर वर्ग आमतौर पर पहली बार लोड होने पर प्रारंभ होता है, जिससे संभावित वर्ग लोडर समस्याएं होती हैं। हालांकि, सबसे महत्वपूर्ण लाभ यह है कि, सिंगलटन को अपने उपयोगकर्ताओं को यह मानने के लिए मजबूर किए बिना पॉलिमॉर्फिक रूप से संभाला जा सकता है कि केवल एक ही उदाहरण है।


जॉन स्कीट के उत्तर पर विस्तार करने के लिए

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

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


  1. We can create the object of singleton class and pass it to method.

  2. Singleton class doesn't any restriction of inheritance.

  3. We can't dispose the objects of a static class but can singleton class.


हमारे पास हमारे डीबी ढांचे हैं जो बैक एंड के लिए कनेक्शन बनाता है। एकाधिक उपयोगकर्ताओं में गंदे पढ़ने से बचने के लिए हमने सिंगलटन पैटर्न का उपयोग किया है ताकि यह सुनिश्चित किया जा सके कि हमारे पास किसी भी समय एक उदाहरण उपलब्ध है।

सी # में एक स्थिर वर्ग एक इंटरफेस लागू नहीं कर सकता है। जब एक एकल उदाहरण वर्ग को व्यावसायिक अनुबंध या आईओसी प्रयोजनों के लिए एक इंटरफ़ेस को कार्यान्वित करने की आवश्यकता होती है, तो यह वह जगह है जहां मैं स्टैटिक क्लास के बिना सिंगलटन पैटर्न का उपयोग करता हूं

सिंगलटन स्टेटलेस परिदृश्यों में राज्य को बनाए रखने का एक तरीका प्रदान करता है

उम्मीद है कि आपकी मदद करता है ..


एक ग्राहक परिप्रेक्ष्य से, क्लाइंट के लिए स्थिर व्यवहार ज्ञात है लेकिन क्लाइंट से सिंगलटन व्यवहार छुपाया जा सकता है। ग्राहक कभी नहीं जानता कि वहां केवल एक ही उदाहरण है जो वह बार-बार खेल रहा है।


मैंने लिखा एक लेख में मैंने अपने दृष्टिकोण के बारे में बताया है कि सिंगलटन स्थिर वर्ग से कहीं बेहतर क्यों है:

  1. स्टेटिक क्लास वास्तव में कैननिकल क्लास नहीं है - यह फ़ंक्शंस और चर के साथ एक नामस्थान है
  2. ऑब्जेक्ट उन्मुख प्रोग्रामिंग सिद्धांतों को तोड़ने के कारण स्थैतिक वर्ग का उपयोग करना एक अच्छा अभ्यास नहीं है
  3. स्टेटिक क्लास को दूसरे के लिए पैरामीटर के रूप में पारित नहीं किया जा सकता है
  4. स्टेटिक क्लास "आलसी" प्रारंभिकरण के लिए उपयुक्त नहीं है
  5. स्थिर वर्ग का प्रारंभ और उपयोग हमेशा कठिन ट्रैक किया जाता है
  6. थ्रेड प्रबंधन को कार्यान्वित करना मुश्किल है

There is a huge difference between a single static class instance (that is, a single instance of a class, which happens to be a static or global variable) and a single static pointer to an instance of the class on the heap:

When your application exits, the destructor of the static class instance will be called. That means if you used that static instance as a singleton, your singleton ceased working properly. If there is still code running that uses that singleton, for example in a different thread, that code is likely to crash.


स्टेटिक क्लास: -

  1. आप स्थैतिक वर्ग का उदाहरण नहीं बना सकते हैं।

  2. जब .NET Framework सामान्य भाषा रनटाइम (सीएलआर) द्वारा स्वचालित रूप से लोड किया जाता है जब कक्षा या प्रोग्राम युक्त नामस्थान लोड होता है।

  3. स्टेटिक क्लास में कन्स्ट्रक्टर नहीं हो सकता है।

  4. हम स्थिर वर्ग को विधि में पास नहीं कर सकते हैं।

  5. हम स्टेटिक क्लास को सी # में किसी अन्य स्टेटिक क्लास में वारिस नहीं कर सकते हैं।

  6. एक वर्ग जिसमें सभी स्थिर तरीके हैं।

  7. बेहतर प्रदर्शन (स्थिर तरीके संकलन समय पर बंधे होते हैं)

सिंगलटन: -

  1. आप ऑब्जेक्ट का एक उदाहरण बना सकते हैं और इसका पुन: उपयोग कर सकते हैं।

  2. सिंगलटन इंस्टेंस पहली बार बनाया गया जब उपयोगकर्ता ने अनुरोध किया था।

  3. सिंगलटन कक्षा में कन्स्ट्रक्टर हो सकता है।

  4. आप सिंगलटन कक्षा का ऑब्जेक्ट बना सकते हैं और इसे विधि में पास कर सकते हैं।

  5. सिंगलटन कक्षा विरासत का कोई प्रतिबंध नहीं कहती है।

  6. हम एक सिंगलटन वर्ग की वस्तुओं का निपटान कर सकते हैं लेकिन स्थैतिक वर्ग की नहीं।

  7. तरीके ओवरराइड किया जा सकता है।

  8. आवश्यकता होने पर आलसी लोड हो सकता है (स्थैतिक वर्ग हमेशा लोड होते हैं)।

  9. हम इंटरफ़ेस को कार्यान्वित कर सकते हैं (स्थिर वर्ग इंटरफ़ेस लागू नहीं कर सकता)।


static वर्गों को कुछ भी राज्य की आवश्यकता नहीं होनी चाहिए, यह कार्यों के गुच्छा को एक साथ रखने के लिए उपयोगी है यानी Math (या परियोजनाओं में उपयोग)। तो वर्ग का नाम सिर्फ हमें एक सुराग देता है जहां हम कार्यों को पा सकते हैं और कुछ और नहीं है।

Singleton मेरा पसंदीदा पैटर्न है और इसे एक बिंदु पर कुछ प्रबंधित करने के लिए उपयोग करें। यह static वर्गों की तुलना में अधिक लचीला है और राज्य को बनाए रख सकता है। यह इंटरफेस को कार्यान्वित कर सकता है, अन्य वर्गों से प्राप्त होता है और विरासत की अनुमति देता है।

static और singleton बीच चयन करने के लिए मेरा नियम:

यदि कार्यों का समूह एक साथ रखा जाना चाहिए, तो static पसंद है। कुछ और जो कुछ संसाधनों के लिए एकल पहुंच की आवश्यकता है, को singleton लागू किया जा सकता है।


मैं इस परिभाषा से सहमत हूं:

" एकल " शब्द का अर्थ एप्लिकेशन जीवन चक्र में एकल वस्तु है, इसलिए दायरा आवेदन स्तर पर है।

स्थिर में कोई ऑब्जेक्ट पॉइंटर नहीं है, इसलिए दायरा ऐप डोमेन स्तर पर है।

इसके अलावा दोनों को थ्रेड-सुरक्षित होने के लिए लागू किया जाना चाहिए।

आप सिंगलटन पैटर्न बनाम स्टेटिक क्लास के बारे में दिलचस्प अन्य अंतर पा सकते हैं





singleton