2012-12-14 6 views
41

मैं जावा में फैक्टरी पैटर्न को लागू करने की कोशिश कर रहा हूं। मेरे पास आकार वाला एक वर्ग है जिसे मंडल और त्रिकोण विस्तारित करता है। समस्या यह है कि आकार कन्स्ट्रक्टर को केवल 2 पैरामीटर मिलते हैं जबकि सर्कल को 3 पैरामीटर मिलते हैं और इसलिए त्रिकोण है (जो मैं कोड अनुभाग में नहीं दिखाऊंगा क्योंकि सर्किल के समान है)। बेहतर प्रदर्शन करने के लिए:जावा में फैक्टरी जब कंक्रीट ऑब्जेक्ट्स अलग कन्स्ट्रक्टर पैरामीटर लेते हैं

private interface ShapeFactory{ 
     public Shape create(int x, int y); 
    } 

    private class CircleFactory implements ShapeFactory{ 
     public Shape create(float radius, int x, int y){ //error 
      return new Circle(radius, x,y); 
     } 
    } 

कोई भी विचार कैसे इस समस्या को दूर करने के लिए? मुझे कारखाने के अंदर उपयोगकर्ता से इनपुट प्राप्त नहीं करना चाहिए (बाहर से प्राप्त किया जाना चाहिए)।

धन्यवाद!

+0

आप एक कारखाने का उपयोग क्यों करना चाहते हैं? आप क्या हासिल करने का प्रयास कर रहे हैं? – miniBill

+1

सोचा कि यह एक मीठा समाधान नहीं है, आप कंक्रीट आकार विशिष्ट पैरामीटर के अतिरिक्त मानचित्र पास कर सकते हैं। इसके अलावा: क्या सृजन पर त्रिज्या प्रदान करना आवश्यक है? आप सृजन पर कुछ डिफ़ॉल्ट त्रिज्या सेट कर सकते हैं और फिर आकार बनाने के बाद आवश्यक त्रिज्या सेट कर सकते हैं। – nidu

+0

ठीक है, मैंने इस विकल्प के बारे में सोचा, लेकिन यह निर्माता के विचार के विपरीत है ... – Jjang

उत्तर

27

आपके पास दो विकल्प

RectangularShape extends Shape

RoundShape extends Shape

और RectangularShapeFactory और RoundShapeFactory

2) Builder (भी प्रभावी जावा में आइटम 2 को देखने के)

public Shape { 
    private final int x; 
    private final int y; 
    private final double radius; 

    private Shape(Builder builder) { 
     x = builder.x; 
     y = builder.y; 
     radius = builder.radius; 
    } 

    public static class Builder { 
     private final int x; 
     private final int y; 
     private double radius; 

     public Builder(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public Builder radius(double radius) { 
      this.radius = radius; 
      return this; 
     } 

     public Shape build() { 
      return new Shape(this); 
     }  
    } 
} 

//in client code 

    Shape rectangle = new Shape.Builder(x,y).build(); 
    Shape circle = new Shape.Builder(x,y).radius(radiusValue).build(); 
+4

सार फैक्टरी इस समस्या को हल नहीं करेगा। सभी 'आकार फैक्ट्री' कार्यान्वयनों को अभी भी एक आम इंटरफ़ेस की आवश्यकता है। – jaco0646

+0

(2) यहां बिल्डर केवल निहित सेवा लोकेटर विरोधी पैटर्न की तरह दिखता है। – SerG

6

जो आप करने की कोशिश कर रहे हैं वह बस असंभव है। यदि कन्स्ट्रक्टर तर्क अलग हैं, तो क्लाइंट कोड को Circle के लिए Square के लिए अलग-अलग काम करना होगा और आप इसे समान कोड के साथ हल नहीं कर सकते हैं। यदि कोई अन्य काम है तो कारखाने कन्स्ट्रक्टर तर्कों को संभालने के अलावा कर रहा है जो आपको लगता है कि कारखाने में ऐसा होना चाहिए, तो आपको इसे अपने प्रश्न पर पोस्ट करना होगा और इस सामान्य कोड-कार्य को फैक्टरिंग में आपकी कठिनाई बताएं।

1) Abstract Factory:

5

आपके सभी कार्यान्वयनों को समान संख्या में तर्क लेना चाहिए। आपके पास विकल्प हैं

  • कारखाने में अतिरिक्त तर्क हैं ताकि आपको केवल उदाहरण के लिए केंद्र प्रदान करने की आवश्यकता हो।
  • कारखाने में सभी तर्क लेते हैं भले ही कुछ कारखानों में से कुछ को अनदेखा कर दिया जाए।
  • एक तर्क चर लंबाई है। जैसे 'डबल ...' इसके साथ समस्या यह है कि कॉलर को यह जानने की जरूरत है कि फैक्ट्री के उद्देश्य को कौन सा कारखाना चाहिए। IMHO।
+0

क्या आप आज विकल्प 2 के साथ जाने का सुझाव देंगे? –

+0

केवल पहला विकल्प उचित सार फैक्टरी पैटर्न में उपलब्ध है। एक फैक्ट्री बनाने के लिए एक और तरीका बनाने के लिए CreateTriangle और CreateCircule बनाते हैं लेकिन यह ओपी लक्ष्य के लिए ऑर्थोगोनल लगता है। – SerG

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