2010-03-29 16 views
6

फैक्टरी विधि पैटर्न का मेरे समझ है (मुझे सही अगर मैं गलत हूँ)फैक्टरी विधि पैटर्न स्पष्टीकरण

फैक्टरी विधि पैटर्न

"फैक्टरी विधि प्रतिनिधियों के लिए ग्राहक उत्पाद निर्माण की अनुमति (इंस्टेंस क्रिएशन) उप-वर्ग में "।

ऐसी दो स्थितियां हैं जिनमें हम फैक्टरी विधि पैटर्न बनाने के लिए जा सकते हैं।

(i) जब ग्राहक उत्पाद (इंस्टेंस) निर्माण तक सीमित है।

(ii) कई उत्पादों रहे हैं available.But एक निर्णय किए जाने के लिए जो उत्पाद उदाहरण जरूरत लौटा दी है।

आप सार विधि पैटर्न

  • आप अमूर्त उत्पाद
  • कंक्रीट उत्पाद
  • फैक्टरी विधि उपयुक्त उत्पाद वापस जाने के लिए की आवश्यकता है बनाना चाहते हैं।

उदाहरण:

public enum ORMChoice 
{ 
    L2SQL, 
    EFM, 
    LS, 
    Sonic 
} 
//Abstract Product 
public interface IProduct 
{ 
    void ProductTaken(); 
} 
//Concrete Product 
public class LinqtoSql : IProduct 
{ 
    public void ProductTaken() 
    { 
    Console.WriteLine("OR Mapping Taken:LinqtoSql"); 
    } 
} 
//concrete product 
public class Subsonic : IProduct 
{ 
    public void ProductTaken() 
    { 
     Console.WriteLine("OR Mapping Taken:Subsonic"); 
    } 
} 
//concrete product 
public class EntityFramework : IProduct 
{ 
    public void ProductTaken() 
    { 
     Console.WriteLine("OR Mapping Taken:EntityFramework"); 
    } 
    } 
//concrete product 
public class LightSpeed : IProduct 
{ 
    public void ProductTaken() 
    { 
    Console.WriteLine("OR Mapping Taken :LightSpeed"); 
    } 
    } 

public class Creator 
{ 
    //Factory Method 
    public IProduct ReturnORTool(ORMChoice choice) 
    { 
     switch (choice) 
     { 
     case ORMChoice.EFM:return new EntityFramework(); 
     break; 
     case ORMChoice.L2SQL:return new LinqtoSql(); 
     break; 
     case ORMChoice.LS:return new LightSpeed(); 
     break; 
     case ORMChoice.Sonic:return new Subsonic(); 
     break; 
     default: return null; 
     } 
    } 

} 

**Client** 

Button_Click() 
{ 
Creator c = new Creator(); 
IProduct p = c.ReturnORTool(ORMChoice.L2SQL); 
p.ProductTaken(); 

} 

फैक्टरी विधि की मेरी समझ सही है है?

+0

btw, एक 'enum' का उपयोग कर इस तरह अनावश्यक' switch'-आईएनजी में परिणाम की संभावना है। ऐसे मामलों में मैं प्रत्येक विकल्प के लिए एक अलग समारोह का उपयोग करना पसंद करता हूं। –

उत्तर

1

आपके पास वास्तव में Abstract Factory Pattern का अधिक है, केवल यह कि आप कारखाने (Creator) सार नहीं हैं। कारक विधि पैटर्न उपवर्गीकरण के लिए विशेष रूप से उपयोगी है:

class A { 
public: 
    A() : m_Member(GetMember()) 
    { 
    } 
protected: 
    virtual ISomeInterface * GetMember() { // default impl here } 
private: 
    ISomeInterface * m_Member; 
} 

अब A की उपवर्गों GetMember ओवरराइड कर सकते हैं सुपर क्लास ISomeInterface की एक विशिष्ट कार्यान्वयन का उपयोग करने के लिए।

+0

हाहाहा, यह वास्तव में मुझे हंसता है जब आप मुझे इस बारे में सही कर रहे थे ** नहीं ** * फैक्टरी पैटर्न * !! मैं आपके साथ बहस नहीं कर रहा हूं, लेकिन बस इसे ज़ोर से पढ़ो। शब्दों के मामूली परिवर्तन के साथ: "आपके पास एक * सार फैक्टरी पैटर्न * है जो केवल आपका कारखाना सार नहीं है"। अमूर्त भाग के बिना एक * सार फैक्टरी पैटर्न * एक * फैक्टरी पैटर्न * नहीं होगा? ;-) (यहां पूर्ण जीभ-इन-गाल - मैं दोनों के बीच के अंतर से परिचित नहीं हूं।) – Jaxidian

+0

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

+0

तो यह करता है! वास्तव में, पुस्तक के अंदर पहली चीज, सामने के कवर पर, सार फैक्ट्री के बारे में एक अस्पष्टता है। अब मुझे याद है जब मैंने पहली बार पढ़ा था कि मैंने सोचा था, "यह एक मानक फैक्टरी पैटर्न की तरह लगता है।" मैंने अपने कुछ पैटर्न के साथ ऐसा किया। हालांकि, मैं यहां आपके "सही नाम" टिप्पणी के बारे में थोड़ी सी बात करना चाहता हूं - एसओओ एक ही चीज़ के लिए कई नाम हैं जिन्हें सभी को "सही" माना जाता है। सिर्फ इसलिए कि जीओएफ इसे कुछ कहता है, भले ही यह ** ** ** पैटर्न के लिए किताब है, इसका मतलब यह नहीं है कि यह एकमात्र सही है। यह सब के बाद, सुंदर दिनांकित है ... – Jaxidian

-1

हां, यह लागू करने का एक सही तरीका प्रतीत होता है, हालांकि यह काफी सरल है। हकीकत में, आप विभिन्न मानकों के गुजरने के लिए जिम्मेदार होना चाह सकते हैं जो हमेशा सभी प्रकार के अनुरूप नहीं हो सकते हैं। शब्दकोश/सूचियां/hashtables/आदि। इसके लिए उपयोगी हैं, जैसे क्रमबद्ध वस्तुओं और/या एक्सएमएल और अन्य गतिशील चीजें हैं।

+1

-1 क्योंकि, जैसा कि मैंने अपने जवाब में बताया, यह एक कारखाना विधि नहीं है, इसलिए यह इसे लागू करने का सही तरीका नहीं है। –

0

एक वस्तु बनाने के लिए एक इंटरफेस को परिभाषित करें, लेकिन जाने उपवर्गों जो वर्ग का दृष्टांत का फैसला। फैक्टरी विधि क्लास को उप-वर्गों के लिए तत्कालता प्रदान करने देता है।

अधिक जानकारी और वहाँ उदाहरण: http://www.dofactory.com/Patterns/PatternFactory.aspx

संबंधित मुद्दे