फैक्टरी पैटर्न स्वाभाविक रूप से OCP का उल्लंघन करने वाला नहीं है।
यह पर निर्भर करता है कि आप Complex
का व्यवहार आगे लेते हैं।
तो Complex
Complex
वस्तु के नए प्रकार के उत्पादन का समर्थन करने के लिए आवश्यक है, और आप नए fromX
विधियां जोड़कर Complex
संशोधित करने के लिए उन्हें समर्थन करने के लिए जोड़ रहे हैं चुनते हैं, तो इसका मतलब है कि Complex
OCP क्योंकि Complex
चाहिए की एक उल्लंघन हो जाता है संशोधन के लिए फिर से खोला जा:
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));
}
//class opened for modification
public static Complex fromOtherMeans(String x , String y) {
return new Complex(x, y);
}
}
आपको अपने आप को जावा वर्ग बदलने के लिए होने के दोषमुक्त करने के लिए किसी प्रकार की एक पाठ फ़ाइल या गुण फ़ाइल में नीचे इस समस्या को धक्का सकता है, लेकिन यह आप पर रोक नहीं लगाता ord में समाधान के इस क्षेत्र में अतिरिक्त तर्क लिखने से नए प्रकार के Complex
का समर्थन करने के लिए एर।
आपके डिजाइन में Complex
के उपयोग के आधार पर (विभिन्न प्रकार अलग कैसे हैं? आप उनका उपयोग कैसे कर रहे हैं?), कुछ वैकल्पिक विकल्प हैं जो अच्छी तरह से लागू हो सकते हैं।
ऐसे OCP अनुकूल विकल्प अतिरिक्त फैक्टरी विधियों को प्रदान करने के लिए Complex
को उपclass करना है। एक सबक्लास सबसे सरल उदाहरण है कि कैसे Complex
बढ़ाया गया है लेकिन संशोधित नहीं किया गया है।
इस मामले में Complex
बदलने के लिए एक और OCP अनुकूल विकल्प Decorator pattern है। Complex
के नए रूपों को बनाने की क्षमता के साथ निरंतर सजावट Complex
ओसीपी का सम्मान करती है क्योंकि Complex
संशोधित नहीं है लेकिन इसे नई कार्यक्षमता के साथ लपेटकर बढ़ाया गया है।
Complex
की संरचना को बदलने के लिए एक तीसरा विकल्प हो सकता है ताकि इसकी गणना संरचना द्वारा आपूर्ति की जा सके। Complex
के विभिन्न व्यवहारों के बीच अलग-अलग होने के लिए Strategy pattern का उपयोग करने का अवसर आपके सामने खुल जाएगा।
फैक्टरी पैटर्न के बारे में बात यह है कि यह संदर्भ कोड सम्मान OCP में मदद करता है। OCP के दाहिने तरफ अपने कारखाने वर्ग के साथ रहने के लिए उपर्युक्त तकनीकों में से एक को नियोजित किया जा सकता है, लेकिन आपके सहयोगी ऑब्जेक्ट ग्राफ़ पर एक नज़र डालने की संभावना रखते हैं, एक फैक्ट्री पर ऑब्जेक्ट ग्राफ़ रखने के ज्ञान पर सवाल उठाते हैं , और इसे एक फैक्ट्री में वापस सरलीकृत करें, जो आपको पहले उदाहरण पर वापस लाता है।
ऐसे मामलों में, बल्कि फैक्टरी पैटर्न SOLID सिद्धांतों का सम्मान करने के अपने कार्यान्वयन मोड़ करने की कोशिश कर की तुलना में, क्यों आप इसे सभी पर प्रयोग कर रहे हैं पर विचार करें।
मैं जानना चाहता हूं कि उत्तर देने से पहले आप इसके बारे में क्या सोचते हैं। आपका जवाब मुझे महसूस करेगा कि आप उत्तर की तलाश में हैं। अन्यथा ऐसा लगता है कि आप अपने काम को आउटसोर्स कर रहे हैं। –
क्षमा करें, एक टिप्पणी जोड़ने की योजना बना रहा था, लेकिन काम से छेड़छाड़ की गई। :) मुझे लगता है कि यह इसका उल्लंघन करता है। अगर मैं गलत हूं तो कृपया मुझे सही करें, लेकिन एफएमपी एक निजी कन्स्ट्रक्टर को निर्देशित करता है, और एक निजी कन्स्ट्रक्टर एक्सटेंशन को प्रतिबंधित करता है। साथ ही, वैकल्पिक कार्यान्वयन का समर्थन करने के लिए वर्ग को संशोधित नहीं किया जाना चाहिए? मैं उस स्थिति के बारे में सोच रहा हूं जहां एक वर्ग में स्थैतिक कारखाने के तरीके हैं। शायद यह एफएमपी का केवल एक स्वाद है? –
यदि यह एक बच्चा वर्ग है तो आप विधि को ओवरराइड कर सकते हैं या सुपर() (जावा मानते हैं) का उपयोग कर सकते हैं। आप स्थैतिक तरीकों से बेहतर नहीं हैं और एक ही विधि है जो पैरामीटर लेती है जिसके लिए स्विच स्टेटमेंट का उपयोग करना या प्रदान की गई कॉन्फ़िगरेशन फ़ाइल में पढ़ना है। –