2009-05-27 9 views
5

ठीक है, सवाल क्रिस्टल स्पष्ट नहीं हो सकता है। मुझे कुछ विवरण दें:मैं फैक्ट्री क्लास के लिए एक कन्स्ट्रक्टर कैसे उपलब्ध करा सकता हूं?

मान लें कि मेरे पास एक जूता (सीएसएचओ) ऑब्जेक्ट फैक्ट्री क्लास है जिसे CFactory कहा जाता है। CFactory एक सिंगलटन वर्ग है जो एक सरल हैशप का उपयोग करके सभी instanciated जूते बनाता है और स्टोर करता है। इसके बाद बनाई गई वस्तुओं का उपयोग करने के लिए स्थिर विधियों के माध्यम से इसका उपयोग किया जाता है।

क्या CShoe के निर्माता को मजबूर करने का कोई तरीका है ताकि इसे केवल कारखाने द्वारा बुलाया जा सके? (दूसरे शब्दों में, सुनिश्चित करें कि जूते का निर्माण केवल जूते कारखाने सिंगलटन वर्ग द्वारा किया जा सकता है, न कि अन्य कक्षाओं द्वारा)

उत्तर

5

आप ShoeShoeFactory के inner class कर सकता है:

public class ShoeFactory { 

    public static class Shoe { 
     private String name; 

     private Shoe() { 
     } 

     private Shoe(String name) { 
      this.name = name; 
     } 
    } 

    public static Shoe createShoe(String shoeName) { 
     return new Shoe(shoeName); 
    } 
} 

मुझे लगता है कि यह काफी कवर सब को छोड़कर मामलों .... प्रतिबिंब:

public class SmellyShoe { 

    public static void main(String[] args) { 
     try { 
      java.lang.reflect.Constructor c = Shoe.class.getDeclaredConstructors()[0]; 
      c.setAccessible(true); 
      Shoe smelly = (Shoe)c.newInstance(null); 
      // grr 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

क्या आप उत्पाद को कारखाने का घोंसला वर्ग बनाना चाहते हैं ?? –

+0

आप CShoe को एक आंतरिक वर्ग (स्थैतिक वर्ग नहीं) भी बना सकते हैं। ऐसा करके, आप अन्य लोगों को सीएफएचओ के उदाहरण के बिना सीएफएचओ का उदाहरण बनाने में सक्षम होने से भी रोक देंगे। – Chii

+0

प्रतिबिंब * हमेशा * setAccessible() विधि के साथ एक्सेस कंट्रोल संशोधक को हटाने में सक्षम है, यदि आपका उदाहरण चलाने में सक्षम है। आप सुरक्षा प्रबंधक के साथ चलकर इसे रोक सकते हैं जो "suppressAccessChecks" अनुमति को अस्वीकार करता है, http://java.sun.com/docs/books/tutorial/essential/environment/security.html –

4

आप CShoe कन्स्ट्रक्टर पैकेज एक्सेस दे सकते हैं, और उसी पैकेज में CShoe और CFactory दोनों डाल सकते हैं ।

1

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

0

आप शायद फैक्टर ऑब्जेक्ट को कन्स्ट्रक्टर में पास कर सकते हैं?

public CShoe(CFactory factory) 
{ 
    if (factory == null || 
      !factory.isValid()) // or whatever 
    { 
     throw new IllegalArgumentException(); 
    } 
} 
0

नहीं किया जा सका ' आप सिर्फ कॉलर इंस्टेंस को जूता के स्थिर सदस्य के तर्क के रूप में पास करते हैं और वहां एक चेक है जैसे "isInst anceOf "जो कन्स्ट्रक्टर को सच कहता है?

1

सबसे पहले, यदि आप सभी बनाए गए उदाहरण बनाए रखते हैं, जिसे रिसाव के रूप में जाना जाता है। मैं मानता हूं कि आपका मतलब एक गैर-मजबूत संदर्भ, बाध्य या कुछ ऐसे कैश है, और यह भी कि Shoe अपरिवर्तनीय है।

कारखाने को वापस करने के लिए बस static विधि का उपयोग करें।

public final class Shoe implements Footwear { 
    private static final FootwearFactory<Shoe,Something> FACTORY = 
     new FootwearFactory<Shoe,Something>() { 
      ... 
      public Shoe get(Something value) { 
       value = new Something(value); 
       ... 
       return new Show(value); 
      } 
     }; 
    private static FootwearFactory<Shoe,Something> getFactory() { 
     return FACTORY; 
    } 

    private final Something value; 
    private Shoe(Something value) { 
     this.value = value; 
    } 
    ... 
} 
+0

हमम देखें, इस प्रकार कारखाना काम करता है । मैं इस बार गलत था ... तो, कारखाना उत्पाद से संबंधित होना चाहिए ... अच्छा !!! –

+0

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

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

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