में स्विच स्टेटमेंट मैं समझता हूं कि सरल फैक्ट्री पर फैक्टरी विधि के मुख्य फायदों में से एक यह है कि यह ओपन-क्लोज़ेड सॉलिड सिद्धांत का उल्लंघन नहीं करता है। यही है, जब नए प्रकार जोड़े जाते हैं तो पूर्व को स्विच स्टेटमेंट को संशोधित करने की आवश्यकता नहीं होती है।सरल फैक्टरी बनाम फैक्टरी विधि: कारखाने बनाम क्लाइंट
एक ऐसा टुकड़ा है जिस पर मैं स्पष्टीकरण प्राप्त करने की उम्मीद कर रहा हूं। अगर मैं एक साधारण कारखाने का उपयोग करने के लिए गए थे, मैं एक इस तरह का कारखाना (सरलीकृत) होगा:
public class ObjectFactory {
public static IObject CreateObject(ObjectTypeEnum objectType) {
switch (objectType) {
case TypeA:
return ObjectA;
break;
case TypeB:
return ObjectB;
break;
case TypeC:
return ObjectC;
break;
}
}
}
और ग्राहक इस तरह यह कहेंगे:
IObject myObject = ObjectFactory.CreateObject(objectType);
साहित्य में नुकसान यह है कि है जब नए ऑब्जेक्ट प्रकार जोड़े जाते हैं तो CreateObject को संशोधित करने की आवश्यकता होगी।
लेकिन फैक्टरी विधि के साथ, हम सिर्फ इस संशोधन कारखाने से ग्राहक को यह (क्लाइंट कोड) की तरह आगे बढ़ नहीं किया जाएगा,: इस मामले में
IObject myObject;
switch (objectType) {
case TypeA:
myObject = ObjectAFactory.CreateObject();
break;
case TypeB:
myObject = ObjectBFactory.CreateObject();
break;
case TypeC:
myObject = ObjectCFactory.CreateObject();
break;
}
ग्राहक संशोधित करने की आवश्यकता होगी हर बार एक नया प्रकार जोड़ा जाता है, पिछले मामले में बनाम कारखाने को संशोधित करने की आवश्यकता होगी। तो फिर एक दूसरे के ऊपर क्या लाभ है? कृपया इसे डुप्लिकेट के रूप में चिह्नित न करें, मैंने कारखानों के बारे में कई SO पोस्ट देखे हैं और कोई भी इस विशिष्ट भेद को संबोधित नहीं करता है।
क्या कोई बेहतर समाधान है जो क्लाइंट या फैक्ट्री पक्ष पर ओपन/क्लोज़ेड सिद्धांत का उल्लंघन नहीं करता है?
यह अनिवार्य रूप से ऊपर मेरे दूसरे विकल्प का एक बदलाव है। कारण यह मेरे लिए काम नहीं करता है कि मेरे मामले में कारखाने का "ग्राहक" वास्तव में एक वेब एपीआई है। ऑब्जेक्ट प्रकार के लिए वेब एपीआई का क्लाइंट ("क्लाइंट का क्लाइंट") निर्धारित कारक होगा, इसलिए मुझे ऑब्जेक्ट प्रकार पर स्विच किए बिना इंजेक्ट करने का कोई तरीका नहीं दिख रहा है, चाहे वह एपीआई में है जो कि बनाता है IFactory या कारखाने में ही। – mayabelle
ग्राहक ऑब्जेक्ट प्रकार कैसे निर्धारित करते हैं? – GFranke
ग्राहक ऑब्जेक्ट प्रकार को पास करता है जिसे वे एपीआई चाहते हैं। ऑब्जेक्ट प्रकार एक enum मान है। – mayabelle