2012-05-08 15 views
5

मैंने नीचे फैक्टरी पैटर्न को कार्यान्वित किया है।फैक्टरी पैटर्न समझना

हालांकि, चूंकि व्यक्तिगत कक्षाएं सार्वजनिक हैं, इसलिए कुछ भी उन्हें तुरंत चालू करने से रोकता है।

क्या यह सही है? मैं कैसे सुनिश्चित करूं कि ठोस वर्ग केवल फैक्ट्री के माध्यम से बनाए जाते हैं?

namespace MRS.Framework 
{ 
    public abstract class DataSource 
    { 
     public override string ToString() 
     { 
      return "DataSource"; 
     } 
    } 

    public class XMLDataSource : DataSource 
    { 

    } 

    public class SqlDataSource : DataSource 
    { 

    } 

    public class CSVDataSource : DataSource 
    { 
     public int MyProperty { get; set; } 


     public override string ToString() 
     { 
      return "CSVDataSource"; 
     } 
    } 
} 

फैक्टरी कार्यान्वयन

namespace MRS.Framework 
{ 
    public abstract class DataSourceFactory 
    { 
     public abstract DataSource CreateDataSource(DataSourceType datasourcetype); 
    } 

    public class CSVDataSourceFactory : DataSourceFactory 
    { 
     public CSVDataSourceFactory() 
     { 

     } 
     public override DataSource CreateDataSource(DataSourceType datasourcetype) 
     { 
      return new CSVDataSource(); 
     } 
    } 


    public class XMLDataSourceFactory : DataSourceFactory 
    { 
     public override DataSource CreateDataSource(DataSourceType datasourcetype) 
     { 
      return new XMLDataSource(); 
     } 
    } 

    public class SqlDataSourceFactory : DataSourceFactory 
    { 
     public override DataSource CreateDataSource(DataSourceType datasourcetype) 
     { 
      return new SqlDataSource(); 
     } 
    } 

} 

मुख्य

static void Main(string[] args) 
     { 
      DataSourceFactory datasourcefactory = new CSVDataSourceFactory(); 
      CSVDataSource ds = (CSVDataSource)datasourcefactory.CreateDataSource(DataSourceType.CSVDataSource); 
      CSVDataSource myds = new CSVDataSource(); 
      Console.WriteLine(ds.ToString()); 
      Console.WriteLine(myds.ToString()); 
      Console.ReadLine(); 

     } 
+0

वास्तविक समस्या क्या है जिसे आप हल करने का प्रयास कर रहे हैं? – Steven

+3

कभी-कभी मुझे आश्चर्य होता है कि अगर लोगों ने अपनी मूल भाषा में प्रश्न लिखे हैं और अच्छे अंग्रेजी वाले किसी व्यक्ति ने इसका अनुवाद किया है तो यह हर किसी के लिए आसान होगा। – SimpleVar

+1

वह तथ्य यह है कि वर्तमान वर्ग परिभाषाओं कोई केवल कारखाने के माध्यम से विशिष्ट डेटा स्रोत बनाने सीधे के बजाय करने की अनुमति होगी की चर्चा करते हुए है। –

उत्तर

6

हाँ, अपने अंतर्ज्ञान यहाँ सही है; यदि आप अपने CSVDataSourceFactory कक्षा के निर्माण को प्रतिबंधित करना चाहते हैं तो आपके पास आपके एक्सेस संशोधक गलत हैं।

हालांकि, यह उस वर्ग का एक्सेस संशोधक नहीं है जिसे आपको ठीक करने की आवश्यकता है, यह कन्स्ट्रक्टर का एक्सेस संशोधक है। आपको डिफ़ॉल्ट कन्स्ट्रक्टर internal चिह्नित करना चाहिए ताकि आपकी असेंबली के भीतर केवल अन्य वर्ग ही उनका निर्माण कर सकें। आपको, निश्चित रूप से, उस असेंबली के भीतर अपने नियमों को लागू करना होगा, लेकिन चूंकि आपके पास उस कोड पर पूर्ण नियंत्रण है, इसलिए यह कोई मुद्दा नहीं होना चाहिए।

public class XMLDataSource : DataSource 
{ 
    internal XMLDataSource() { } 
} 

public class SqlDataSource : DataSource 
{ 
    internal SqlDataSource() { } 
} 

public class CSVDataSource : DataSource 
{ 
    public int MyProperty { get; set; } 

    internal CSVDataSource() { } 

    public override string ToString() 
    { 
     return "CSVDataSource"; 
    } 
} 
+4

यह सरल शब्दों में ध्यान दिया जाना चाहिए: एक ही प्रोजेक्ट में सभी फैक्ट्री-क्लासेस और फैक्ट्री क्लास रखें, और उस परियोजना में कुछ और न होने दें। – SimpleVar

+0

यह निश्चित रूप से मेरी मदद करता है। जानना चाहते हैं कि एक्सेस विनिर्देशों के संबंध में फैक्टरी पैटर्न का मानक रूप क्या है? – sameer

+1

आपकी ज़रूरतों के आधार पर कुछ अलग शैलियों हैं। कंक्रीट कक्षाओं के लिए रचनाकारों को "छिपाने" के बाद, आपके पास जो असामान्य नहीं है, वह असामान्य नहीं है। @ Servy के उत्तर में एक और आम पैटर्न दिया गया है: अपनी ठोस कक्षाओं को 'आंतरिक' बनाएं लेकिन एक 'सार्वजनिक इंटरफ़ेस' लागू करें जो आपका कारखाना लौटाता है। डब्ल्यूसीएफ फैक्ट्री क्लास के अंदर घोंसले वाले 'संरक्षित' वर्गों के साथ इसका एक भिन्नता उपयोग करता है (उदाहरण के लिए 'एचटीपी चैनेल फैक्ट्री। क्रेतेचनल()' एक नया एचटीपी चैनेल फैक्ट्री। एचटीपीआरक्वैस्ट चैनल() ') देता है। मुझे इस बारे में पाइपलाइन में एक ब्लॉग पोस्ट मिला है , लेकिन दुर्भाग्य से कुछ हफ्ते दूर है। –

2

क्या आप जानते हैं datasources आप इंटरफेस के माध्यम से यह कर सकते हैं के उदाहरण बनाने के लिए सक्षम किया जा रहा से रोकने के लिए कैसे करना चाहते हैं। प्रत्येक डेटासोर्स के लिए एक इंटरफ़ेस बनाएं जिसमें आप जिस विधि को बेनकाब करना चाहते हैं उसके साथ। कक्षा को खुद को आंतरिक या फैक्ट्री की निजी आंतरिक कक्षा (आंतरिक आमतौर पर उपयुक्त) और इंटरफ़ेस सार्वजनिक बनाएं।

यदि प्रश्न यह नहीं है कि लोगों को उदाहरण बनाने से कैसे रोकें, लेकिन यदि आपको करना चाहिए, तो यह एक व्यक्तिपरक उत्तर है। विचार करने के लिए कुछ बातें हैं:

  1. किसी व्यक्ति के कारक को छोड़कर और अपना डेटासेट बनाने का क्या परिणाम हैं? बुरा कुछ भी नहीं? गरीब प्रदर्शन? प्रमुख सुरक्षा उल्लंघन? अगर वे केवल पैर में खुद को शूटिंग कर रहे हैं या कुछ भी चोट नहीं पहुंचा रहे हैं, तो शायद आपको उन्हें रोकने के लिए परेशान करने की आवश्यकता नहीं है।
  2. उन्हें रोकने के लिए कितना मुश्किल है? क्या आपको अंतर्निहित वर्ग तक पहुंचने के लिए प्रतिबिंब का उपयोग करने से रोकने की आवश्यकता है? एक इंटरफ़ेस परत पर्याप्त उपयोग कर रहा है?
  3. आपके उपयोगकर्ता कितने भरोसेमंद हैं? क्या यह सिर्फ आपके स्वयं के उपयोग के लिए या अपनी टीम के उपयोग के लिए एक आंतरिक ऐप है? क्या इसे हजारों अन्य लोगों को भेज दिया जा रहा है? एक छोटा आंतरिक उपयोग ऐप परेशान नहीं हो सकता है, बड़े पैमाने पर किसी को यह मानने की जरूरत है कि वास्तव में दुर्भावनापूर्ण या अज्ञानी उपयोगकर्ता हैं और जो आप सामने लेते हैं, वह महत्वपूर्ण रूप से महत्वपूर्ण होगा। उपयोगकर्ताबेस बढ़ने के साथ ही सामान्य रूप से उपयोगिता में सुधार करना भी महत्वपूर्ण है।
संबंधित मुद्दे