Magento 1 पर मैगेंटो 2 के कारखाने के पैटर्न के फायदे


15

Magento 2 गैर-इंजेक्शन के लिए कारखाने की कक्षाओं का उपयोग कर रहा है।

उदाहरण के लिए उत्पाद वर्ग: ProductFactory
उदाहरण के लिए ग्राहक वर्ग:CustomerFactory

मुझे समझ नहीं आ रहा है कि फ़ैक्टरी पैटर्न किस प्रकार का है?

क्योंकि 1 कारखाना वर्ग से जुड़े प्रत्येक वर्ग के लिए। मैं इसके कुछ डुप्लिकेट सोच रहा हूँ। क्यों हम के लिए सार कारखाना नहीं बनाना चाहिए CustomerFactory, ProductFactoryआदि?

और उदाहरण के लिए भी:

हम पारित कर सकते हैं AbstractFactoryप्रकार की जाँच के लिए के बजाय ProductFactoryमें ProductRepositoryवर्ग निर्माता।

तो हम ProductRepositoryऔर के बीच तंग युग्मन से बच सकते हैंProductFactory


सार फैक्टरी वर्ग:

namespace Magento\Framework\ObjectManager\Code\Generator;

/**
 * Abstract Factory class 
 */
abstract class AbstractFactory 
{
    /**
     * Object Manager instance
     *
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_objectManager = null;

    /**
     * Instance name to create
     *
     * @var string
     */
    protected $_instanceName = null;


    /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \Magento\Catalog\Model\Product
     */
    public function create(array $data = array())
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }
}

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

namespace Magento\Catalog\Model;
use Magento\Framework\ObjectManager\Code\Generator\AbstractFactory;
/**
 * Factory class for @see \Magento\Catalog\Model\Product
 */
class ProductFactory extends AbstractFactory
{

    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\Magento\\Catalog\\Model\\Product')
    {

        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

}

वस्तु प्रबंधक और कारखाने के बीच क्या संबंध है?

वस्तुओं का पीछा करना बहुत है:

  • उदाहरण के लिए ProductRepository(यहाँ हम इसे ग्राहक के रूप में कह सकते हैं) को Productऑब्जेक्ट की आवश्यकता है।

  • इसके लिए इसकी विशिष्ट ProductFactoryवस्तु पर निर्भर करता है।

  • ProductFactoryऑब्जेक्ट ऑब्जेक्ट पर निर्भर करता है ObjectManager

  • ObjectManagerऑब्जेक्ट फैक्टरी ऑब्जेक्ट (यहां Developer Object) पर निर्भर करता है ।

बेशक वे ढीले युग्मन के लिए इंटरफेस का उपयोग कर रहे हैं। अभी भी वास्तव में भ्रामक प्रवाह।

आप किसी Magento 2 कारखाने पैटर्न के साथ में गहराई से लाभ दे सकते हैं और यह भी कैसे Magento 1 से अलग है?

जवाबों:


8

एक बात याद रखें कि हम ऑटो-फैक्ट्री क्लासेस हैं, केवल यदि आप खुद को प्रभावित नहीं करते हैं। इसका मतलब है, अगर आपको कारखाने में कुछ विशेष जादू करने की आवश्यकता है, तो आप ऐसा कर सकते हैं। (उदाहरण के लिए, यदि आप किसी कारण से हर रचना को लॉग इन करना चाहते हैं, तो कारखाने को स्वयं लिखें और हम इसे ऑटो-जेनरेट नहीं करेंगे।) यदि हमने हर चीज के लिए एक ही सार कारखाना वर्ग का उपयोग किया है, तो यह काम नहीं करेगा।

यह डिबगिंग के साथ थोड़ी मदद भी कर सकता है - आपको वास्तविक वर्ग देखने को मिलता है, ब्रेकप्वाइंट सेट कर सकते हैं, अधिक सार्थक स्टैक-ट्रैस आदि देख सकते हैं।


छोटा गैप हो सकता है..इस प्रकार की जाँच केवल मैं अमूर्त वर्ग का उपयोग करना चाहता हूँ..लेकिन जब भी मैं गुजरता हूँ तो केवल कंक्रीट फैक्ट्री क्लास पास करना चाहता हूँ।
शिवकुमार

रुचिकर - मैंने दूसरे तरीके पर विचार किया होगा। मैं चाहूंगा कि CustomerFactory पास हो जाए, इसलिए मेरे पास टाइप हिन्टिंग है जो बनाएँ () ग्राहक को लौटा देगा। AbstractFactory के साथ, मैं कारखाने से लौटी हुई वस्तु के प्रकार को काम करने के लिए php स्टॉर्म प्रकार hinting का उपयोग नहीं कर सकता। (या मैं कुछ याद कर रहा हूँ?)
एलन केंट

8

मैं यहां गलत हो सकता हूं, लेकिन यह एक ऐसा फायदा है जो मुझे मिला।
ऑटो उत्पन्न कारखाने कुछ ऐसे हैं जैसे जादू पाने वाले या बसने वाले।
मान लें कि आप चाहते हैं कि कुछ तब हो जब एक विशिष्ट इकाई (चलो इसे ब्लॉगपोस्ट कहते हैं) का एक उदाहरण बनाया गया है। मान लें कि आप किसी फ़ील्ड में डिफ़ॉल्ट मान सेट करना चाहते हैं।
उदाहरण सबसे अच्छा नहीं हो सकता है, लेकिन मुझे सुन सकते हैं।
यदि आप एक अमूर्त कारखाने का उपयोग करते हैं, तो आपको इसे संशोधित करना होगा ताकि जब आप 'BlogPost' पैरामीटर के रूप में उदाहरण प्राप्त कर सकें तो आप setDateतुरंत कॉल करने के बाद कॉल करें ।

यदि आप ऑटोजेनरेटेड कारखाने का उपयोग करते हैं, तो आप बाद में उस कारखाने को बना सकते हैं, setterअपने कोड में कॉल कर सकते हैं, उत्पन्न कारखाने को हटा सकते हैं और यह काम करेगा।
आप जादू सेटर के साथ क्या करते हैं, इसके समान। आप विधि को लागू करते हैं और इसे हर जगह कहा जाता है।


हाय Marius.thanks आपकी प्रतिक्रिया के लिए। आप के साथ नि: शुल्क। अधिक जानकारी की जरूरत है।
शिवकुमार

@sivakumar। मैं एक कोर टीम के सदस्य से भी जवाब पसंद करूंगा।
मेरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.