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?
fuente
Puedo estar equivocado aquí, pero esta es una ventaja que encontré.
Las fábricas autogeneradas son algo similares con los captadores o setters mágicos.
Supongamos que desea que suceda algo cuando se crea una instancia de una entidad específica (llamémosla BlogPost). Supongamos que desea establecer un valor predeterminado en un campo.
El ejemplo puede no ser el mejor, pero escúchame.
Si usa una fábrica abstracta, tendrá que modificarla para que cuando reciba el nombre de instancia como parámetro 'BlogPost' llame
setDate
después de crear una instancia.Si usa la fábrica autogenerada, más tarde puede crear esa fábrica, llamar
setter
a su código, eliminar la fábrica generada y funcionará.Similar a lo que haces con el setter mágico. Implementa el método y se llama en todas partes.
fuente