Magento 2 中的设计模式——工厂方法

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《Magento2.X企业级开发实战》

在 Magento 2 中,Factory 使用 Object manager,而 Object manager 使用 Factory。 在继续之前,我们建议您阅读之前的博客文章,这将有助于更深入地了解 Magento 2 中的两种模式及其适用性方法。

我们可以假设工厂方法是创建型设计模式中最常用的方法之一。 这种牵引是基于契约(接口)灵活对象初始化的必要性。 根据 GOF(“四人帮”:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides),工厂方法是:

“工厂方法模式定义了一个用于创建对象的接口,但让子类决定实例化哪个类。 工厂方法允许类将实例化推迟到子类,这对于为特定目的构造单个对象很有用,而请求者不知道正在实例化的特定类。” – GOF – 工厂方法模式。

简单地说,软件应用程序对特定的对象初始化有一个定义好的契约,而工厂方法是一个工具,保证这个契约对不同的类的履行。 这有助于解耦对象及其构造。 坚固的美。

在 Magento 2 中,工厂方法对整个应用程序的所有层都起着至关重要的作用。 让我们在下一节中更详细地回顾这一点。

生成工厂
数据对象是 Magento 2 架构服务层的一部分,代表实体——例如客户或目录。

根据它们的接口声明,工厂方法是生成这些对象的新实例的最佳方法。但这意味着对于每个 Data 实体接口,开发人员必须创建单独的工厂实现。从开发人员的角度来看,这听起来像是开销。不是吗? Magento 2 在这种情况下有一个很好的特性,我们将详细审查它。

Magento 2 的核心功能之一是代码生成。在官方文档中,有一篇很好的文章解释了代码生成的好处——强烈推荐阅读。我们不会深入研究这个材料,但会说代码生成简化了数据对象工厂的生成。
在 Magento\Framework\ObjectManager\Code\Generator\Factory 中可以清楚地看到工厂生成的魔力。此类具有包含工厂所需部分的预定义结构。让我们详细回顾一下这个生成器类和 CustomerInterfaceFactory。

工厂初始化
下面的代码描述了工厂构造函数。 它由两个参数组成:对象管理器和数据对象实体的类名。 这就是 Magento 2 中的工厂方法实现在 Magento 2 中需要的全部内容。

  /**
     * Get default constructor definition for generated class
     *
     * @return array
     */
    protected function _getDefaultConstructorDefinition()
    {
        return [
            'name' => '__construct',
            'parameters' => [
                ['name' => 'objectManager', 'type' => '\\' . \Magento\Framework\ObjectManagerInterface::class],
                ['name' => 'instanceName', 'defaultValue' => $this->getSourceClassName()],
            ],
            'body' => "\$this->_objectManager = \$objectManager;\n\$this->_instanceName = \$instanceName;",
            'docblock' => [
                'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor',
                'tags' => [
                    [
                        'name' => 'param',
                        'description' => '\Magento\Framework\ObjectManagerInterface $objectManager',
                    ],
                    ['name' => 'param', 'description' => 'string $instanceName'],
                ],
            ]
        ];
    }

这是自动生成工厂的示例:

  /**
     * Factory constructor
     *
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     * @param string $instanceName
     */
    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager,
        $instanceName = '\\Magento\\Customer\\Api\\Data\\CustomerInterface'
    ) {
        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

工厂创建方法
根据设计模式名称及其用途,工厂方法实现只需要一种公共方法——create。 在 Magento 2 的 create 方法中,对象管理器根据类名和所需的参数列表创建所请求对象的新实例。 我们在上一篇文章——Magento 2 中的设计模式——对象管理器中描述了对象管理器的创建过程和目的。

工厂类生成器中的工厂创建方法结合了以下部分:

/**
 * Returns list of methods for class generator
 *
 * @return array
 */
protected function _getClassMethods()
{
    $construct = $this->_getDefaultConstructorDefinition();
    // public function create(array $data = array())
    $create = [
        'name' => 'create',
        'parameters' => [['name' => 'data', 'type' => 'array', 'defaultValue' => []]],
        'body' => 'return $this->_objectManager->create($this->_instanceName, $data);',
        'docblock' => [
            'shortDescription' => 'Create class instance with specified parameters',
            'tags' => [
                ['name' => 'param', 'description' => 'array $data'],
                [
                    'name' => 'return',
                    'description' => $this->getSourceClassName()
                ],
            ],
        ],
    ];
    return [$construct, $create];
}

上例中的 $create 数组包含:

方法名称——创建
方法参数——一个不需要的数据数组,由初始化的类属性及其值组成
body——工厂的“核心”:负责新对象实例生成的代码
Dockblock 和标签 – 包含附加信息
让我们将注意力转移到方法的主体上,并在自动生成的示例上查看它:

   /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \Magento\Customer\Api\Data\CustomerInterface
     */
    public function create(array $data = [])
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }


上面的代码表明,在 Magento 2 中,Factory 方法的核心是对象管理器与 create 方法的使用。它接受一个实例名称并将其与一些参数结合以启动一个全新的对象。

工厂方法使用
工厂方法的使用旨在通过遵循解耦对象的特定契约来初始化新对象。与所有其他软件应用程序架构一样,Magento 2 使用这种方法来处理对象生成。最常用的方面是服务层的Data对象初始化。

例如,在 Api/Data/Data-object-name-Interface 中声明了一些 Data 对象。为了生成这个对象的新实例,Magento 2 提供了以下算法:使用 Api/Data/Data-object-name-Interface + 后缀工厂。这将告诉 Magento 2 框架使用(或如果不存在则生成)一个新的工厂类,并允许在应用程序中使用它。上面已经描述了工厂的内部结构。

考虑到局限性,从 Magento 2 的角度来看没有。工厂方法使用简单,对应用层没有任何负面影响。

总之,我们想说使用工厂方法开发的 Magento 2 架构遵循 OOP(面向对象编程)世界中的最佳实践和 SOLID 原则。 自动生成的工厂是平台常用的模式用于数据对象初始化的方式。 工厂方法还允许解耦对象并在业务代码和对象管理器之间提供一个层。

值得一提的是,自动生成的工厂并不是这种方法被广泛使用的唯一地方。 我们的下一篇文章将专门介绍命令模式,在那里我们将强调使用工厂方法和其他模式对实现结构良好且灵活的软件架构的重要性。 请继续关注以了解所审查的模式(对象管理器、工厂方法)如何与命令模式一起发挥神奇的作用。

如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。