当前位置: 技术文章>> Magento 2 中的设计模式 – 工厂方法

文章标题:Magento 2 中的设计模式 – 工厂方法
  • 文章分类: Magento
  • 27620 阅读
系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》

本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。


我们很高兴介绍专门介绍Magento 2中设计模式系列的第二篇文章。本系列的目标是在设计模式解释的帮助下概述Magento 2架构。我们帖子的顺序基于模式使用的逻辑子序列。因此,选择当前帖子的主题是有原因的。在第一篇文章中,我们描述了Magento 2中建立的模式之一 - 对象管理器。这篇专门介绍工厂方法。

在Magento 2中,工厂使用对象管理器,对象管理器使用工厂。在继续之前,我们建议您阅读之前的博客文章,这将有助于对Magento 2中的这两种模式及其适用性方法有更深入的理解。

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

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

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

简单地说,软件应用程序有一个定义的特定对象初始化的协定,工厂方法是一个保证该协定在不同类中实现的工具。这有助于将物体及其结构解耦。坚实的美丽。

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

生成的工厂

数据对象是Magento 2体系结构的服务层的一部分,表示实体 - 例如客户或目录。

根据其接口声明,Factory 方法是生成这些对象的新实例的最佳方法。但这意味着对于每个数据实体接口,开发人员必须创建一个单独的工厂实现。从开发人员的角度来看,这听起来像是开销。不是吗?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;
    }

工厂创建方法

根据设计模式名称及其用途,Factory 方法实现只需要一个公共方法 – create。在Magento 2的创建方法中,对象管理器根据类名和所需的参数列表创建所请求对象的新实例。我们在上一篇文章中描述了创建过程和对象管理器的目的 – 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 – 工厂的“核心”:负责生成新对象实例的代码

停靠块和标签 – 包含其他信息

让我们将重点转移到方法的主体上,并在自动生成的示例中对其进行回顾:

  /**
     * 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中,工厂方法的核心是对象管理器与创建方法的使用。它采用实例名称并将其与一些参数组合,以启动一个全新的对象。

工厂方法用法

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

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

考虑到限制,从Magento 2的角度来看没有。工厂方法易于使用,不会对应用程序层产生任何负面影响。

总结

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

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


推荐文章