यदि किसी कारण से, आपको कारखाने और निर्मित वर्ग को अलग-अलग असेंबली में होना आवश्यक है (जिसका अर्थ है कि internal
का उपयोग केवल काम नहीं करेगा), और आप यह सुनिश्चित कर सकते हैं कि आपके कारखाने को पहले चलाने का मौका मिले, आप यह कर सकते हैं:
// In factory assembly:
public class Factory
{
public Factory()
{
token = new object();
MyClass.StoreCreateToken(token);
}
public MyClass Create()
{
return new MyClass(token);
}
private object token;
}
// In other assembly:
public class MyClass
{
public static void StoreCreateToken(object token)
{
if (token != null) throw new InvalidOperationException(
"Only one factory can create MyClass.");
this.token = token;
}
public MyClass(object token)
{
if (this.token != token) throw new InvalidOperationException(
"Need an appropriate token to create MyClass.");
}
private static object token;
}
हाँ, यह बोझिल और अजीब है। लेकिन अजीब स्थितियां हो सकती हैं जहां यह वास्तव में एक अच्छा समाधान है।
मुझे यह पसंद है, सिवाय इसके कि 2 समस्याएं हैं ... (1) आपका उदाहरण मुझे केवल 1 कारखाने का उपयोग करने की अनुमति देता है। मैं कई कारखानों को बनाने की अनुमति देना चाहता हूं (शायद फैक्ट्री के विभिन्न स्वाद हैं) केवल आवश्यकता यह है कि माई क्लास का एक वस्तु फैक्ट्री के किसी ऑब्जेक्ट का उपयोग करके बनाई जानी चाहिए। (2) क्या होगा यदि मैं जेनरिक्स का उपयोग एक नई() बाधा के साथ कर रहा हूं और इस प्रकार MyClass को पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए? आपका उदाहरण उस परिदृश्य में काम नहीं करेगा। – JoelFan
"आपका उदाहरण मुझे केवल 1 कारखाने का उपयोग करने की अनुमति देता है।" 'टोकन' स्थिर बनाएं या इसे विभिन्न फैक्ट्री उदाहरणों के बीच किसी अन्य तरीके से साझा करें। टोकन तक पहुंचने वाली किसी भी चीज को 'MyClass'' के उदाहरण बना सकते हैं, यदि मैं एक नई() बाधा के साथ जेनेरिक का उपयोग कर रहा हूं और इस प्रकार MyClass को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता है? " तब आपको कारखाने की जरूरत नहीं है। – munificent