2010-10-27 15 views
18

प्रभावी जावा का कहना है कि आप एकरचनाकारों के बजाय "स्टेटिक फैक्ट्री विधियों" का उपयोग कैसे करें?

class A { 

    public static A getInstance() { 
     return new A(); 
    } 
} 

यह मतलब है वर्ग एक के लिए इस विधि प्रदान करने के लिए है, बजाय नया एक फोन है, तो

"कंस्ट्रक्टर्स के बजाय स्थिर कारखाने तरीकों उपलब्ध कराने पर विचार करें"() कोड में

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java – oksayt

+8

+1 प्रभावी जावा पढ़ने के लिए +1 – flash

उत्तर

21

मुख्य कारणों के एक अच्छे प्रदर्शन के लिए here देखें जो आप ऐसा करना चाहते हैं। संक्षेप में:

  1. नामित "रचनाकार"।
  2. यदि उपयुक्त हो तो शून्य वापस आ सकता है।
  3. उपयुक्त होने पर, व्युत्पन्न कक्षा का एक उदाहरण वापस कर सकता है।
  4. जेनेरिक प्रकारों के चर को तुरंत चालू करते समय वर्बोसिटी कम करें।

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

18

ऊपर दिए गए आपके उदाहरण के लिए यह एक स्थिर निर्माता प्रदान करने के लिए अधिक समझ में नहीं आता है। और आमतौर पर जब आप एक स्थिर कन्स्ट्रक्टर प्रदान करते हैं तो आपको सामान्य कन्स्ट्रक्टर को निजी बनाना चाहिए। अन्यथा सामान्य कन्स्ट्रक्टर के साथ एक उदाहरण बनाना अभी भी संभव है।

मैं यहां एक और उदाहरण के साथ व्याख्या करने की कोशिश करता हूं, जब आप स्थैतिक फैक्ट्री विधियों का उपयोग कर सकते हैं। फायदों में से एक यह है कि आप फैक्ट्री विधियों को समझने योग्य नाम दे सकते हैं।

class Complex { 

    public static Complex fromCartesian(double real, double imag) { 
     return new Complex(real, imag); 
    } 

    public static Complex fromPolar(double modulus, double angle) { 
     return new Complex(modulus * cos(angle), modulus * sin(angle)); 
    } 

    private Complex(double a, double b) { 
     //... 
    } 
} 

Complex c = Complex.fromPolar(1, pi) 

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

public class Singleton { 

    private volatile static Singleton singleton; 

    private Singleton() { 

    } 

    // synchronized keyword has been removed from here 
    public static Singleton getSingleton() { 
     if(singleton==null) { 
      synchronized(Singleton.class){ 
       if(singleton == null) { 
        singleton = new Singleton(); 
       } 
      } 
     } 
     return singleton; 
    } 

} 

Factory Method Pattern Wikipedia

2

स्थिर विधि कॉल के साथ सिंगलटन पैटर्न अगर उर रैत्रांत स्थिर की प्रकृति पर ताला लगा .. की वजह से एक उदाहरण के लिए देख रहा .. धागा सुरक्षा प्रदान करने के लिए और भी बाहर से बचने के लिए एक बेहतर डिजाइन कर रहे हैं ऑर्डर लिखते हैं ..

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