फैक्टरी पैटर्न और अमूर्त कारखाने के बीच क्या अंतर है?


40

अंत में कुछ बुनियादी पैटर्न (कैरियर में बहुत देर से, लेकिन यह एक अलग कहानी है) सीखने की गंभीरता से कोशिश करना शुरू करने के बाद, मैं फैक्ट्री पैटर्न और एब्सट्रैक्ट फ़ैक्टरी के बीच के अंतरों के बारे में अपना सिर पाने की कोशिश कर रहा हूँ।

इन दो पैटर्न के बीच प्रमुख अंतर क्या हैं?

मैं समझता हूं कि फैक्टरी विधि विरासत के माध्यम से वस्तुओं का निर्माण करती है और एब्सट्रैक्ट फैक्ट्री इसे ऑब्जेक्ट कंपोजिशन के माध्यम से बनाती है, लेकिन व्यावहारिक दृष्टिकोण से, मुझे अभी भी वास्तव में यह देखने में परेशानी हो रही है कि वे प्रत्येक कार्य कैसे करते हैं।



2
स्पष्ट करने के लिए, क्या आपका मतलब है "फ़ैक्टरी पद्धति" जब आप "फ़ैक्टरी पैटर्न" कहते हैं? अगर आप गैंग ऑफ फोर पैटर्न की बात कर रहे हैं, तो कोई फैक्ट्री पैटर्न नहीं है, लेकिन एब्सट्रैक्ट फैक्ट्री और फैक्टरी मेथड हैं।
थॉमस ओवेन्स

हाँ - फैक्टरी विधि।
फिल.हेलर

3
निष्पक्ष होने के लिए, दो वाक्यांशों को आम तौर पर परस्पर जुड़ा हुआ लगता है।
फिल.हेलर

1
आह, फैक्टरी विधि। इस तथ्य के लिए वर्कअराउंड कि newएक विधि नहीं है (कुछ में - सामान्य रूप से सामान्य वस्तु सिस्टम)।
डोनल फैलो

जवाबों:


44

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

क्रेडिट कार्ड सत्यापनकर्ता कारखाने के बारे में सोचें जो प्रत्येक कार्ड प्रकार के लिए एक अलग सत्यापनकर्ता लौटाता है।

public ICardValidator GetCardValidator (string cardType)
{
    switch (cardType.ToLower())
    {
        case "visa":
            return new VisaCardValidator();
        case "mastercard":
        case "ecmc":
            return new MastercardValidator();
        default:
            throw new CreditCardTypeException("Do not recognise this type");
    }
}

सार फैक्टरी जहां कई ठोस कारखाने वर्गों (नहीं फैक्टरी के तरीके) एक इंटरफ़ेस जो अलग अलग तरीकों से कई अलग अलग प्रकार वापस आ सकते हैं से ली गई है।

भिन्न नियमों के प्रत्येक सेट के लिए एक अलग वर्ग के साथ शतरंज के खेल प्रबंधक के बारे में सोचें।

public class StandardChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class HexagonalChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new HexagonalChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new HexagonalChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class SpeedChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new SpeedChessMoveClock();
    }
}

एक सार फैक्टरी, एक रणनीति की तरह, अक्सर एक फैक्ट्री मेथड का उपयोग करके चुना जाता है, लेकिन उन्हें संयोजित करने के लिए आवश्यक नहीं है, इसलिए यह अपना स्वयं का पैटर्न है।


3
क्या फैक्टरी विधि की व्याख्या सही है? के बारे में क्या है "कारखाना विधि पैटर्न विरासत पर निर्भर करता है, जैसा कि ऑब्जेक्ट निर्माण उपवर्गों को सौंपा गया है जो ऑब्जेक्ट बनाने के लिए फैक्टरी विधि को लागू करते हैं"। तो उदाहरण स्टैटिक फैक्टरी की तरह है।
सर्ग

@SerG खैर, निष्पक्षता में, आपने वह उद्धरण विकिपीडिया से लिया है, जो तीन साल पहले बहुत अलग तरीके से पढ़े गए पृष्ठ पर है। मैं यह तर्क दूंगा कि वर्तमान विकिपीडिया पृष्ठ कई स्थानों पर स्वयं विरोधाभासी है, लेकिन मुझे इसे अलग करने में शामिल होने की इच्छा नहीं है। मैं जिस चीज के बारे में सोचता हूं, वह इस दृष्टि से है कि जो उदाहरण मैंने यहां दिया है, वह एक विशिष्ट प्रकार की फैक्ट्री विधि है, जिसे Parameterized Factory Method के रूप में जाना जाता है। लेकिन फैक्ट्री मेथड और एब्सट्रैक्ट फैक्ट्री के बीच के अंतर के बारे में सभी प्रकार के फैक्ट्री मेथड में अंतर है।
पीडीआर

2
मेरे उद्धरण के रूप में एक ही कथन GoF "डिज़ाइन पैटर्न" में मौजूद है। और Parameterized FM भी वहाँ वर्णित है।
सर्ज

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

आपको अपने जवाब में स्पष्ट करना चाहिए कि आपका उदाहरण एक विशिष्ट कारखाना विधि पैटर्न नहीं है, लेकिन कुछ विशेषज्ञता मानकीकृत कारखाने विधि का नाम है। और ठेठ कारखाने विधि की परिभाषा के बारे में लिखें, क्योंकि यह अभी गुमराह कर रहा है। मैं सिर्फ फैक्ट्री मेथड पैटर्न के बारे में सीख रहा था, मैं सब कुछ समझ गया और फिर मैंने वह जवाब पढ़ा जो कि फैक्ट्री मेथड पैटर्न को कुछ अलग दिखाता है और मैं उलझन में था। उस उदाहरण के बारे में कोई जानकारी नहीं है कि विशिष्ट कारखाना विधि पैटर्न नहीं है। टिप्पणी में इसे इंगित करने के लिए सर्ज को धन्यवाद।
ctomek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.