Magento2工厂模式相对于Magento 1的优势


15

Magento 2对非注射剂使用工厂类。

例如产品类别:ProductFactory
例如客户类别:CustomerFactory

我不明白这里的工厂模式是什么?

因为对于与1个工厂类关联的每个类。我在想它有些重复。 为什么我们不应该创建抽象工厂CustomerFactoryProductFactory等等?

并且例如:

我们可以通过AbstractFactory进行类型检查,而不是ProductFactoryProductRepository类的构造函数。

因此我们可以避免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(在这里我们可以称其为客户端)require Product对象。

  • 为此,它取决于特定的ProductFactory对象。

  • ProductFactory对象取决于ObjectManager对象。

  • ObjectManager对象取决于Factory对象(此处为Developer Object)。

当然,他们使用接口进行松耦合。仍然令人困惑。

您是否可以利用Magento 2工厂模式深入了解其优势,以及它与Magento 1有何不同?

Answers:


8

要记住的一件事是,只有您自己定义一个时,我们才自动生成工厂类。这意味着,如果您需要在工厂中做一些特殊的魔术,则可以这样做。(例如,如果出于某种原因要记录实例的每次创建,请自行编写工厂,我们将不会自动生成该工厂。)如果我们对所有内容使用单个抽象工厂类,则此方法将无效。

它还可以帮助调试-您可以看到真实的类,可以设置断点,查看更有意义的堆栈跟踪等。


可能很小..仅用于类型检查。我想使用抽象类..但是每当通过时,我只希望通过具体的工厂类。
sivakumar 2015年

有趣的-我会考虑另一种方式。我希望将CustomerFactory传递进来,所以我有类型提示create()将返回Customer。使用AbstractFactory,我无法使用php Storm类型提示来计算出工厂返回的对象的类型。(或者我想念什么吗?)
艾伦·肯特

8

我可能在这里错了,但这是我发现的优势。
自动生成的工厂在某些方面与魔术吸气器或安装器相似。
假设您希望在创建特定实体(称为BlogPost)的实例时发生某些事情。假设您要为字段设置默认值。
这个例子可能不是最好的,但请听我说。
如果使用抽象工厂,则必须对其进行修改,以便在实例化名称作为参数“ BlogPost”接收到实例名称setDate后调用。

如果您使用自动生成的工厂,则可以在以后创建该工厂,setter在代码中调用,删除生成的工厂,它将起作用。
类似于您使用魔术二传手进行的操作。您实现该方法,并且到处都会调用它。


您好Marius。感谢您的回复。同意您的意见。仍然需要更多信息。
sivakumar 2015年

@sivakumar。我也希望得到核心团队成员的回答。
马里斯(Marius)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.