Magento 2 está utilizando clases de fábrica para no inyectables.
Por ejemplo, clase de producto: ProductFactory
Por ejemplo, clase de cliente:CustomerFactory
No entiendo cuál es el tipo de patrón de fábrica aquí.
Porque para cada clase asociada con 1 clase de fábrica. Estoy pensando que es algo duplicado.
¿Por qué no deberíamos crear una fábrica abstracta para CustomerFactory
, ProductFactory
etc.?
y también por ejemplo:
Podemos pasar AbstractFactory
para la verificación de tipo en lugar de ProductFactory
en el ProductRepository
constructor de clase.
Así podemos evitar un acoplamiento estrecho entre ProductRepository
yProductFactory
Clase abstracta de fábrica:
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);
}
}
Implementación de Abstract Factory:
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;
}
}
¿Cuál es la relación entre el administrador de objetos y la fábrica?
Hay mucho de encadenar objetos:
Por ejemplo
ProductRepository
(aquí podemos llamarlo como cliente) requiereProduct
objeto.Para esto depende de un
ProductFactory
objeto específico .ProductFactory
El objeto depende delObjectManager
objeto.ObjectManager
El objeto depende del objeto de fábrica (aquíDeveloper Object
).
Por supuesto, están utilizando interfaces para acoplamiento flojo. Sigue siendo un flujo realmente confuso.
¿Alguien puede dar ventajas en profundidad con el patrón de fábrica Magento 2 y también en qué se diferencia de Magento 1?