Magento 2 использует фабричные классы для неинъекционных препаратов.
Например, класс продукта: ProductFactory
Например, класс клиента:CustomerFactory
Я не понимаю, какой тип фабричной модели здесь?
Потому что для каждого класса связан 1 фабричный класс. Я думаю, что-то дублирует.
Почему мы не должны создавать абстрактные фабрики CustomerFactory
и ProductFactory
т. Д.?
а также например:
Мы можем передать AbstractFactory
для проверки типа вместо ProductFactory
в ProductRepository
конструкторе класса.
Таким образом , мы можем избежать тесной связи между ProductRepository
иProductFactory
Абстрактный Фабричный класс:
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);
}
}
Реализация фабрики:
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;
}
}
Какова связь между менеджером объектов и фабрикой?
Существует так много цепочек объектов:
Например
ProductRepository
(здесь мы можем назвать его клиентом) требуетсяProduct
объект.Это зависит от конкретного
ProductFactory
объекта.ProductFactory
объект зависит отObjectManager
объекта.ObjectManager
объект зависит от объекта Factory (здесьDeveloper Object
).
Конечно, они используют интерфейсы для слабой связи. Все еще действительно запутанный поток.
Можете ли вы дать кому-то всестороннее преимущество с заводским шаблоном Magento 2, а также чем он отличается от Magento 1?
источник
Я могу ошибаться, но это преимущество, которое я нашел.
Автоматически созданные фабрики похожи на магические добытчики или сеттеры.
Допустим, вы хотите, чтобы что-то происходило при создании экземпляра определенной сущности (назовем его BlogPost). Допустим, вы хотите установить значение по умолчанию для поля.
Пример не может быть лучшим, но выслушайте меня.
Если вы используете абстрактную фабрику, вам придется изменить ее так, чтобы при получении instanceName в качестве параметра «BlogPost» вы вызывали
setDate
после создания экземпляра.Если вы используете
setter
автоматически сгенерированную фабрику , вы можете позже создать эту фабрику, вызвать ее в своем коде, удалить сгенерированную фабрику, и она будет работать.Подобно тому, что вы делаете с волшебным сеттером. Вы реализуете метод, и он вызывается везде.
источник