2009-02-05 14 views
74

हाल ही में मैं अपने कुछ कोड को सुरक्षित करने के बारे में सोच रहा हूं। मैं उत्सुक हूं कि कोई यह सुनिश्चित कर सकता है कि कोई ऑब्जेक्ट सीधे कभी नहीं बनाया जा सकता है, लेकिन केवल फैक्ट्री क्लास की कुछ विधि के माध्यम से। मान लें कि मेरे पास कुछ "व्यावसायिक वस्तु" वर्ग है और मैं यह सुनिश्चित करना चाहता हूं कि इस वर्ग के किसी भी उदाहरण में एक वैध आंतरिक स्थिति होगी। इसे प्राप्त करने के लिए मुझे ऑब्जेक्ट बनाने से पहले कुछ रचना करने की आवश्यकता होगी, शायद इसके कन्स्ट्रक्टर में। यह ठीक है जब तक कि मैं फैसला नहीं करता कि मैं यह चेक व्यापार तर्क का हिस्सा बनना चाहता हूं। तो, मैं किसी व्यवसाय ऑब्जेक्ट को केवल अपने व्यवसाय तर्क वर्ग में कुछ विधि के माध्यम से रचनात्मक होने की व्यवस्था कैसे कर सकता हूं लेकिन सीधे कभी नहीं? सी ++ के अच्छे पुराने "दोस्त" कीवर्ड का उपयोग करने की पहली प्राकृतिक इच्छा सी # के साथ कम हो जाएगी। तो हम अन्य विकल्पों की आवश्यकता है ...सी # में फैक्टरी पैटर्न: ऑब्जेक्ट इंस्टेंस को सुनिश्चित करने के लिए केवल फ़ैक्टरी क्लास द्वारा ही बनाया जा सकता है?

के कुछ उदाहरण कोशिश करते हैं:

public MyBusinessObjectClass 
{ 
    public string MyProperty { get; private set; } 

    public MyBusinessObjectClass (string myProperty) 
    { 
     MyProperty = myProperty; 
    } 
} 

public MyBusinessLogicClass 
{ 
    public MyBusinessObjectClass CreateBusinessObject (string myProperty) 
    { 
     // Perform some check on myProperty 

     if (true /* check is okay */) 
      return new MyBusinessObjectClass (myProperty); 

     return null; 
    } 
} 

यह सब ठीक है जब तक आप आप अभी भी सीधे MyBusinessObjectClass उदाहरण बना सकते हैं, इनपुट की जाँच के बिना याद है। मैं उस तकनीकी संभावना को पूरी तरह से बाहर करना चाहता हूं।

तो समुदाय इस बारे में क्या सोचता है?

+0

MyBoClass विधि misspelt है? – pradeeptp

+2

मैं उलझन में हूं, आप अपने व्यापारिक वस्तुओं को अपने स्वयं के आविष्कारों की रक्षा के लिए जिम्मेदार क्यों नहीं बनना चाहेंगे? फैक्ट्री पैटर्न (जैसा कि मैं इसे समझता हूं) का बिंदु या तो ए है) कई निर्भरताओं के साथ एक जटिल वर्ग के निर्माण के साथ सौदा करता है या बी) फैक्ट्री को यह तय करने दें कि किस रनटाइम प्रकार को वापस करने के लिए, केवल एक इंटरफेस/सार का खुलासा करना क्लाइंट के लिए वर्ग। अपने व्यापारिक वस्तुओं में अपने व्यवसाय के नियमों को रखना ओओपी का बहुत ही ईसाई है। – kai

+0

@ क्यूई ट्रू, व्यवसाय ऑब्जेक्ट इसके आविष्कार की सुरक्षा के लिए ज़िम्मेदार है, लेकिन ** कन्स्ट्रक्टर कॉलर यह सुनिश्चित करना है कि कन्स्ट्रक्टर ** में उन्हें पास करने से पहले तर्क वैध हैं!'CreateBusinessObject' विधि का उद्देश्य तर्कों को सत्यापित करना है और एक विधि में कॉल करने के लिए वैध हैं या नहीं, जब कॉलर को तुरंत पता नहीं होता है कि कन्स्ट्रक्टर में गुजरने के लिए तर्क वैध हैं या नहीं। – Lightman

उत्तर

54

ऐसा लगता है कि तुम सिर्फ वस्तु बनाने के पहले कुछ व्यापार तर्क चलाना चाहते हैं - तो क्यों तुम सिर्फ "BusinessClass" है कि सभी गंदे "myProperty" जाँच काम करता है के अंदर एक स्थिर विधि बनाने नहीं है, और बनाने के कन्स्ट्रक्टर निजी?

public BusinessClass 
{ 
    public string MyProperty { get; private set; } 

    private BusinessClass() 
    { 
    } 

    private BusinessClass(string myProperty) 
    { 
     MyProperty = myProperty; 
    } 

    public static BusinessClass CreateObject(string myProperty) 
    { 
     // Perform some check on myProperty 

     if (/* all ok */) 
      return new BusinessClass(myProperty); 

     return null; 
    } 
} 

यह होगा कॉलिंग बिल्कुल स्पष्ट हो:

BusinessClass objBusiness = BusinessClass.CreateObject(someProperty); 
+6

आह, आप शून्य को वापस करने के बजाय अपवाद भी फेंक सकते हैं। –

+4

यदि आपने कस्टम घोषित किया है तो निजी डिफॉल्ट कन्स्ट्रक्टर होने में कोई बात नहीं है। इसके अलावा, इस मामले में असली कन्स्ट्रक्टर में सत्यापन करने के बजाए स्थिर "कन्स्ट्रक्टर" का उपयोग करने से सचमुच कुछ भी प्राप्त नहीं किया जा सकता है (क्योंकि यह कक्षा का हिस्सा है)। यह भी काम है, क्योंकि अब आप एनआरई के लिए खुलने के लिए एक शून्य वापसी मूल्य प्राप्त कर सकते हैं और "यह शून्य क्या मतलब है?" प्रशन। – kai

+0

इंटरफेस/अमूर्त बेस क्लास के माध्यम से इस आर्किटेक्चर की आवश्यकता के लिए कोई अच्छा तरीका है? यानी एक इंटरफेस/अमूर्त बेस क्लास जो निर्देश देता है कि कार्यान्वयनकर्ताओं को एक सीटीआर का पर्दाफाश नहीं करना चाहिए। –

15

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

public class BusinessObject 
{ 
    private BusinessObject(string property) 
    { 
    } 

    public class Factory 
    { 
     public static BusinessObject CreateBusinessObject(string property) 
     { 
      return new BusinessObject(property); 
     } 
    } 
} 

यह काम करता है क्योंकि नेस्टेड प्रकार उनकी enclosing प्रकार के निजी सदस्यों की पहुंच है:

56

आप निर्माता निजी कारखाने एक नेस्टेड प्रकार बनाने के लिए, और कर सकते हैं। मुझे पता है कि यह थोड़ा सा प्रतिबंधक है, लेकिन उम्मीद है कि इससे मदद मिलेगी ...

+0

मैंने इसके बारे में सोचा लेकिन यह प्रभावी ढंग से इन चेक को व्यावसायिक वस्तु में ले जाता है, जिसे मैं टालने की कोशिश कर रहा हूं। – User

+0

@ तो-परीक्षक: आप अभी भी BusinessObject प्रकार के बजाय कारखाने में चेक कर सकते हैं। –

+3

@ जोनस्केट मुझे पता है कि यह प्रश्न वास्तव में पुराना है, लेकिन मुझे उत्सुकता है कि 'स्थिर व्यवसाय' विषय 'विधि को' नेस्टेड बिजनेस ऑब्जेक्ट 'विधि को नेस्टेड' फैक्टरी 'कक्षा के अंदर डालने का क्या कारण है, यह स्थिर विधि सीधे' BusinessObject' कक्षा ... क्या आप ऐसा करने के लिए अपनी प्रेरणा याद कर सकते हैं? –

7

जॉन ने जो सुझाव दिया है उसके अलावा, आप या तो फैक्ट्री विधि (चेक सहित) भी पहले स्थान पर BusinessObject की एक स्थिर विधि हो सकती है। फिर, कन्स्ट्रक्टर निजी है, और हर किसी को स्थिर विधि का उपयोग करने के लिए मजबूर किया जाएगा।

public class BusinessObject 
{ 
    public static Create (string myProperty) 
    { 
    if (...) 
     return new BusinessObject (myProperty); 
    else 
     return null; 
    } 
} 

लेकिन असली सवाल यह है कि - आपको यह आवश्यकता क्यों है? क्या कारखाने या फैक्ट्री विधि को कक्षा में स्थानांतरित करना स्वीकार्य है?

+0

यह शायद ही कोई आवश्यकता है। मैं बस व्यापार वस्तु और तर्क का एक साफ अलगाव चाहते हैं। जैसे ही पेजों के कोड-इन में इन चेकों को अनुचित करने के लिए अनुचित है, मुझे लगता है कि इन जांचों को स्वयं वस्तुओं में रखना अनुचित है। खैर, शायद मूल सत्यापन, लेकिन वास्तव में व्यापार नियम नहीं है। – User

+0

यदि आप सुविधा की समीक्षा के लिए केवल तर्क और कक्षा की संरचना को अलग करना चाहते हैं, तो आप हमेशा आंशिक कक्षा का उपयोग कर सकते हैं और दोनों अलग फाइलों में ... – Grx70

4

फिर भी एक और (हल्के वजन) विकल्प BusinessObject वर्ग में स्थिर फैक्ट्री विधि बनाना और कन्स्ट्रक्टर को निजी रखना है।

public class BusinessObject 
{ 
    public static BusinessObject NewBusinessObject(string property) 
    { 
     return new BusinessObject(); 
    } 

    private BusinessObject() 
    { 
    } 
} 
45

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

public class BusinessObject 
{ 
    public static BusinessObjectFactory GetFactory() 
    { 
    return new BusinessObjectFactory (p => new BusinessObject (p)); 
    } 

    private BusinessObject(string property) 
    { 
    } 
} 

public class BusinessObjectFactory 
{ 
    private Func<string, BusinessObject> _ctorCaller; 

    public BusinessObjectFactory (Func<string, BusinessObject> ctorCaller) 
    { 
    _ctorCaller = ctorCaller; 
    } 

    public BusinessObject CreateBusinessObject(string myProperty) 
    { 
    if (...) 
     return _ctorCaller (myProperty); 
    else 
     return null; 
    } 
} 

:)

+0

कोड का बहुत अच्छा टुकड़ा है। ऑब्जेक्ट निर्माण तर्क एक अलग वर्ग में है और वस्तु केवल कारखाने का उपयोग करके बनाई जा सकती है। –

+0

कूल। क्या कोई तरीका है कि आप BusinessObjectFactory के निर्माण को static BusinessObject.GetFactory पर सीमित कर सकते हैं? –

+1

इस उलझन का क्या फायदा है? – yatskovsky

2

इसलिए, यह मैं क्या एक "शुद्ध" तरीके से नहीं किया जा सकता है चाहता हूँ की तरह लग रहा है। लॉजिक क्लास में यह हमेशा किसी तरह का "कॉल बैक" होता है।

शायद मैं इसे सरल तरीके से कर सकता हूं, बस ऑब्जेक्ट क्लास में एक कन्स्ट्रक्टर विधि को इनपुट जांचने के लिए लॉजिक क्लास को कॉल करें?

public MyBusinessObjectClass 
{ 
    public string MyProperty { get; private set; } 

    private MyBusinessObjectClass (string myProperty) 
    { 
     MyProperty = myProperty; 
    } 

    pubilc static MyBusinessObjectClass CreateInstance (string myProperty) 
    { 
     if (MyBusinessLogicClass.ValidateBusinessObject (myProperty)) return new MyBusinessObjectClass (myProperty); 

     return null; 
    } 
} 

public MyBusinessLogicClass 
{ 
    public static bool ValidateBusinessObject (string myProperty) 
    { 
     // Perform some check on myProperty 

     return CheckResult; 
    } 
} 

इस तरह, व्यापार वस्तु सीधे रचनात्मक नहीं है और व्यावसायिक तर्क में सार्वजनिक जांच विधि को कोई नुकसान नहीं होगा।

0

मुझे समझ में नहीं आता कि आप "व्यावसायिक वस्तु" से "व्यावसायिक तर्क" को अलग क्यों करना चाहते हैं। यह ऑब्जेक्ट ओरिएंटेशन के विकृति की तरह लगता है, और आप उस दृष्टिकोण को लेकर अपने आप को गठबंधन में बांध देंगे।

+0

मुझे इस भेद को या तो समझ में नहीं आता है। क्या कोई यह समझा सकता है कि यह क्यों किया जा रहा है, और व्यापार वस्तु में कौन सा कोड होगा? – pipTheGeek

+0

यह सिर्फ एक दृष्टिकोण है जिसका उपयोग किया जा सकता है। मैं व्यापार वस्तु को मुख्य रूप से डेटा संरचनाओं के रूप में चाहता हूं लेकिन पढ़ने/लिखने के लिए सभी फ़ील्ड के साथ खुला नहीं हूं। लेकिन सवाल वास्तव में केवल एक फैक्ट्री विधि की सहायता से किसी ऑब्जेक्ट को तुरंत चालू करने में सक्षम होने के बारे में था, न कि सीधे। – User

+0

@ जिम: मैं व्यक्तिगत रूप से आपके बिंदु से सहमत हूं, लेकिन व्यावसायिक रूप से, यह लगातार किया जाता है। मेरा वर्तमान प्रोजेक्ट एक webservice है जो एक HTML स्ट्रिंग लेता है, इसे कुछ प्रीसेट नियमों के अनुसार साफ़ करता है, फिर साफ़ स्ट्रिंग देता है। मुझे अपने कोड के 7 परतों के माध्यम से जाना आवश्यक है "क्योंकि हमारी सभी परियोजनाओं को एक ही परियोजना टेम्पलेट से बनाया जाना चाहिए"। इसका कारण यह है कि ज्यादातर लोग इन प्रश्नों को पूछते हैं इसलिए उन्हें अपने कोड के पूरे प्रवाह को बदलने की आजादी नहीं मिलती है। – Flater

1

मैं कारखाने को डोमेन वर्ग के समान असेंबली में रखूंगा, और डोमेन क्लास के कन्स्ट्रक्टर आंतरिक को चिह्नित करूंगा। इस प्रकार आपके डोमेन में कोई भी वर्ग एक उदाहरण बनाने में सक्षम हो सकता है, लेकिन आप स्वयं पर भरोसा नहीं करते हैं, है ना? डोमेन परत के बाहर कोई भी कोड लिखने के लिए आपके कारखाने का उपयोग करना होगा।

public class Person 
{ 
    internal Person() 
    { 
    } 
} 

public class PersonFactory 
{ 
    public Person Create() 
    { 
    return new Person(); 
    } 
} 

हालांकि, मैं अपने दृष्टिकोण :-)

मुझे लगता है कि अगर आप अपने व्यक्ति वर्ग निर्माण पर मान्य होना चाहते हैं आप निर्माता में कोड लगाना होगा सवाल करना चाहिए।

public class Person 
{ 
    public Person(string firstName, string lastName) 
    { 
    FirstName = firstName; 
    LastName = lastName; 
    Validate(); 
    } 
} 
2

इंटरफेस और कार्यान्वयन के बीच अच्छा पृथक्करण के एक मामले में
संरक्षित-निर्माता-सार्वजनिक-प्रारंभकर्ता पैटर्न एक बहुत साफ समाधान अनुमति देता है।

को देखते हुए एक व्यापार वस्तु:

public interface IBusinessObject { } 

class BusinessObject : IBusinessObject 
{ 
    public static IBusinessObject New() 
    { 
     return new BusinessObject(); 
    } 

    protected BusinessObject() 
    { ... } 
} 

और एक व्यापार का कारखाना:

class BusinessObject : IBusinessObject 
{ 
    public static IBusinessObject New(BusinessFactory factory) 
    { ... } 

    ... 
} 

यहाँ ठोस के लिए एक संदर्भ:

public interface IBusinessFactory { } 

class BusinessFactory : IBusinessFactory 
{ 
    public static IBusinessFactory New() 
    { 
     return new BusinessFactory(); 
    } 

    protected BusinessFactory() 
    { ... } 
} 

BusinessObject.New() प्रारंभकर्ता के लिए निम्न परिवर्तन समाधान देता है BusinessObject.New() पर कॉल करने के लिए व्यवसाय कारखाने की आवश्यकता है प्रारंभकर्ता। लेकिन केवल एक ही जिसके पास आवश्यक संदर्भ है वह व्यवसाय कारखाना है।

हमें जो चाहिए वह मिला: केवल BusinessObjectBusinessFactory बना सकता है।

+0

तो आप सुनिश्चित करते हैं कि ऑब्जेक्ट के केवल काम करने वाले सार्वजनिक कन्स्ट्रक्टर को फैक्ट्री की आवश्यकता है, और उस फैक्ट्री पैरामीटर को केवल फैक्ट्री की स्थैतिक विधि को कॉल करके तुरंत चालू किया जा सकता है? एक कामकाजी समाधान की तरह लगता है, लेकिन मुझे यह महसूस हो रहा है कि 'सार्वजनिक स्थैतिक आईबीनेसऑब्जेक्ट न्यू (बिजनेस फैक्ट्री फैक्ट्री) जैसे स्निपेट कई भौहें उठाएंगे यदि कोई और कोड को बनाए रखता है। – Flater

+0

@ फ्लेटर सहमत। मैं पैरामीटर नाम 'फैक्ट्री' को 'asFriend' में बदल दूंगा। मेरे कोड बेस में यह तब 'सार्वजनिक स्थैतिक IBusinessObject New (BusinessFactory asFriend)' –

+0

के रूप में दिखाएगा, मुझे यह बिल्कुल नहीं मिला है। यह कैसे काम करता है? कारखाना IBusinessObject के नए उदाहरण नहीं बना सकता है और न ही ऐसा करने के लिए कोई इरादा (विधियों) है ...? – lapsus

0

मुझे नहीं लगता कि एक समाधान है जो समस्या से भी बदतर नहीं है, उसके ऊपर सभी को एक सार्वजनिक स्थैतिक कारखाना की आवश्यकता होती है जो आईएमएचओ एक बदतर समस्या है और लोगों को सिर्फ आपके ऑब्जेक्ट का उपयोग करने के लिए कारखाने को बुलाता नहीं है - यह छिपता नहीं है कुछ भी । इंटरफ़ेस का खुलासा करने के लिए सर्वश्रेष्ठ और/या कन्स्ट्रक्टर को आंतरिक के रूप में रखें यदि आप असेंबली विश्वसनीय कोड के बाद से सबसे अच्छी सुरक्षा कर सकते हैं।

एक विकल्प एक स्थिर निर्माता है जो किसी आईओसी कंटेनर की तरह किसी कारखाने को पंजीकृत करता है।

1

यह समाधान munificents पर आधारित है जो कन्स्ट्रक्टर में टोकन का उपयोग करने का विचार है।इस जवाब make sure object only created by factory (C#)

public class BusinessObject 
    { 
     public BusinessObject(object instantiator) 
     { 
      if (instantiator.GetType() != typeof(Factory)) 
       throw new ArgumentException("Instantiator class must be Factory"); 
     } 

    } 

    public class Factory 
    { 
     public BusinessObject CreateBusinessObject() 
     { 
      return new BusinessObject(this); 
     } 
    } 
0

यहाँ में हो गया की नस में एक और उपाय है "सिर्फ इसलिए कि आप मतलब यह नहीं है कर सकते हैं चाहिए" ...

यह व्यापार वस्तु निर्माता रखने की आवश्यकताओं को पूरा करता है निजी और कारखाने के तर्क को किसी अन्य वर्ग में डालना। इसके बाद यह थोड़ा स्केची हो जाता है।

फैक्ट्री क्लास में व्यावसायिक वस्तुओं को बनाने के लिए एक स्थिर विधि है। निजी कन्स्ट्रक्टर को आमंत्रित करने वाली स्थिर संरक्षित निर्माण विधि तक पहुंचने के लिए यह व्यावसायिक ऑब्जेक्ट क्लास से निकला है।

कारखाना सार है इसलिए आप वास्तव में इसका उदाहरण नहीं बना सकते हैं (क्योंकि यह एक व्यावसायिक वस्तु भी होगी, इसलिए यह अजीब होगा), और इसमें एक निजी निर्माता है इसलिए क्लाइंट कोड प्राप्त नहीं हो सकता यह।

क्लाइंट कोड भी व्यावसायिक ऑब्जेक्ट क्लास से प्राप्त करने और संरक्षित (लेकिन अनधिकृत) स्थैतिक निर्माण विधि को कॉल करने से रोका नहीं गया है। या बदतर, संरक्षित डिफ़ॉल्ट कन्स्ट्रक्टर को बुलाकर हमें कारखाने वर्ग को पहले स्थान पर संकलित करने के लिए जोड़ना पड़ा। (जो आकस्मिक रूप से फैक्ट्री क्लास को बिजनेस ऑब्जेक्ट क्लास से अलग करता है, किसी भी पैटर्न के साथ समस्या होने की संभावना है।)

मैं किसी को भी उनके सही दिमाग में सुझाव देने की कोशिश नहीं कर रहा हूं, लेकिन यह एक ऐसा था दिलचस्प अभ्यास। एफडब्ल्यूआईडब्ल्यू, मेरा पसंदीदा समाधान एक आंतरिक कन्स्ट्रक्टर और असेंबली सीमा का उपयोग गार्ड के रूप में करना होगा। विभिन्न समझौतों से साथ

using System; 

public class MyBusinessObjectClass 
{ 
    public string MyProperty { get; private set; } 

    private MyBusinessObjectClass(string myProperty) 
    { 
     MyProperty = myProperty; 
    } 

    // Need accesible default constructor, or else MyBusinessObjectFactory declaration will generate: 
    // error CS0122: 'MyBusinessObjectClass.MyBusinessObjectClass(string)' is inaccessible due to its protection level 
    protected MyBusinessObjectClass() 
    { 
    } 

    protected static MyBusinessObjectClass Construct(string myProperty) 
    { 
     return new MyBusinessObjectClass(myProperty); 
    } 
} 

public abstract class MyBusinessObjectFactory : MyBusinessObjectClass 
{ 
    public static MyBusinessObjectClass CreateBusinessObject(string myProperty) 
    { 
     // Perform some check on myProperty 

     if (true /* check is okay */) 
      return Construct(myProperty); 

     return null; 
    } 

    private MyBusinessObjectFactory() 
    { 
    } 
} 
2
public class HandlerFactory: Handler 
    { 
     public IHandler GetHandler() 
     { 
      return base.CreateMe(); 
     } 
    } 

    public interface IHandler 
    { 
     void DoWork(); 
    } 

    public class Handler : IHandler 
    { 
     public void DoWork() 
     { 
      Console.WriteLine("hander doing work"); 
     } 

     protected IHandler CreateMe() 
     { 
      return new Handler(); 
     } 

     protected Handler(){} 
    } 

    public static void Main(string[] args) 
    { 
     // Handler handler = new Handler();   - this will error out! 
     var factory = new HandlerFactory(); 
     var handler = factory.GetHandler(); 

     handler.DoWork();   // this works! 
    } 
+0

कृपया मेरे दृष्टिकोण का प्रयास करें, 'फैक्ट्री' हैंडलर का कंटेनर है, और केवल यह स्वयं के लिए एक उदाहरण बना सकता है। कुछ संशोधन के साथ, यह आपकी आवश्यकताओं के अनुरूप हो सकता है। – lin

+1

आपके उदाहरण में, निम्नलिखित संभव नहीं होंगे (जो समझ में नहीं आएगा) ?: factory.DoWork(); – Whyser

1

एकाधिक दृष्टिकोण उल्लेख किया गया है।

  • निजी रूप से निर्मित कक्षा में फैक्ट्री क्लास को नज़रअंदाज़ करने से केवल कारखाने को 1 वर्ग का निर्माण करने की अनुमति मिलती है। उस समय आप Create विधि और एक निजी सीटीआर के साथ बेहतर हो सकते हैं।
  • विरासत का उपयोग और संरक्षित सीटीआर का एक ही मुद्दा है।

मैं फैक्ट्री को आंशिक कक्षा के रूप में प्रस्तावित करना चाहता हूं जिसमें सार्वजनिक रचनाकारों के साथ निजी नेस्टेड कक्षाएं हों। आप अपने फैक्ट्री का निर्माण कर रहे ऑब्जेक्ट को 100% छुपा रहे हैं और केवल एक या एकाधिक इंटरफेस के माध्यम से आप जो चुनते हैं उसे उजागर कर रहे हैं।

इस मामले के लिए मैंने जो मामला सुना है, वह तब होगा जब आप कारखाने में 100% उदाहरण ट्रैक करना चाहते हैं। यह डिज़ाइन किसी को भी गारंटी नहीं देता है लेकिन फैक्ट्री के पास "फैक्ट्री" में परिभाषित "रसायनों" के उदाहरण बनाने के लिए पहुंच है और यह इसे प्राप्त करने के लिए एक अलग असेंबली की आवश्यकता को हटा देता है।

== ChemicalFactory.cs == 
partial class ChemicalFactory { 
    private ChemicalFactory() {} 

    public interface IChemical { 
     int AtomicNumber { get; } 
    } 

    public static IChemical CreateOxygen() { 
     return new Oxygen(); 
    } 
} 


== Oxygen.cs == 
partial class ChemicalFactory { 
    private class Oxygen : IChemical { 
     public Oxygen() { 
      AtomicNumber = 8; 
     } 
     public int AtomicNumber { get; } 
    } 
} 



== Program.cs == 
class Program { 
    static void Main(string[] args) { 
     var ox = ChemicalFactory.CreateOxygen(); 
     Console.WriteLine(ox.AtomicNumber); 
    } 
} 
संबंधित मुद्दे