Magento 2 está usando classes de fábrica para não injetáveis.
Por exemplo classe de produto: ProductFactory
Por exemplo classe de cliente:CustomerFactory
Não entendo qual é o tipo de padrão de fábrica aqui?
Porque para cada classe associada a 1 classe de fábrica. Estou pensando que é algo duplicado.
Por que não deveríamos criar fábrica abstrata para CustomerFactory
, ProductFactory
etc?
e também por exemplo:
Podemos passar AbstractFactory
pela verificação de tipo em vez de ProductFactory
no ProductRepository
construtor de classe.
Para evitar o acoplamento apertado entre ProductRepository
eProductFactory
Classe de fábrica abstrata:
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);
}
}
Resumo Implementação de fábrica:
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;
}
}
Qual é a relação entre o gerenciador de objetos e a fábrica?
Há muitos objetos encadeados:
Por exemplo
ProductRepository
(aqui podemos chamá-lo como cliente) requerProduct
objeto.Para isso, depende de
ProductFactory
objeto específico .ProductFactory
objeto depende doObjectManager
objeto.ObjectManager
objeto depende do objeto de fábrica (aquiDeveloper Object
).
É claro que eles estão usando interfaces para acoplamentos soltos. Fluxo ainda muito confuso.
Você pode dar vantagens detalhadas com o padrão de fábrica do Magento 2 e também como ele difere do Magento 1?
fonte
Posso estar errado aqui, mas essa é uma vantagem que encontrei.
As fábricas geradas automaticamente são parecidas com os getters ou setters mágicos.
Digamos que você queira que algo aconteça quando uma instância de uma entidade específica (vamos chamá-la de BlogPost) é criada. Digamos que você queira definir um valor padrão para um campo.
O exemplo pode não ser o melhor, mas ouça-me.
Se você usar um factory abstrato, precisará modificá-lo para que, ao receber o instanceName como parâmetro 'BlogPost', chame
setDate
após instanciar.Se você usar uma fábrica
setter
gerada automaticamente, mais tarde poderá criar essa fábrica, chamar o código, remover a fábrica gerada e ela funcionará.Semelhante ao que você faz com o setter mágico. Você implementa o método e ele é chamado em qualquer lugar.
fonte