Magento 1보다 Magento2 팩토리 패턴의 장점


15

Magento 2는 주사 불가능한 팩토리 클래스를 사용하고 있습니다.

제품 클래스 ProductFactory
예 : 고객 클래스 예 :CustomerFactory

공장 패턴 유형이 무엇인지 이해하지 못 합니까?

1 개의 팩토리 클래스와 연관된 각 클래스에 대해. 중복되는 것으로 생각합니다. 왜 우리는 추상 공장 작성해서는 안 CustomerFactory, ProductFactory등?

또한 예를 들면 다음과 같습니다.

우리는 통과 할 수 AbstractFactory유형 검사를 위해 대신 ProductFactoryProductRepository클래스 생성자.

우리가 간의 긴밀한 결합을 방지 할 수 있도록 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객체는 팩토리 객체 (여기 Developer Object) 에 따라 다릅니다 .

물론 그들은 느슨한 결합을 위해 인터페이스를 사용하고 있습니다. 여전히 혼란스러운 흐름.

누군가가 Magento 2 팩토리 패턴과 Magento 1과의 차이점에 대해 심층적 인 이점을 줄 수 있습니까?

답변:


8

기억해야 할 것은 하나는 자신을 정의하지 않은 경우에만 팩토리 클래스를 자동 생성한다는 것입니다. 즉, 공장에서 특별한 마술을 해야하는 경우 그렇게 할 수 있습니다. (예를 들어 어떤 이유로 든 인스턴스 생성을 모두 기록하려면 팩토리를 직접 작성하면 자동 생성되지 않습니다.) 모든 것에 단일 추상 팩토리 클래스를 사용한 경우에는 작동하지 않습니다.

또한 디버깅에 약간의 도움을 줄 수 있습니다. 실제 클래스를 보거나 중단 점을 설정할 수 있으며 더 의미있는 스택 추적을 볼 수 있습니다.


작은 틈이있을 수 있습니다. 유형 검사 만 추상 클래스를 사용하고 싶습니다.
sivakumar

흥미 롭다 – 나는 다른 방법을 고려했을 것이다. create ()가 Customer를 반환한다는 힌트를 제공하기 위해 CustomerFactory를 전달하고 싶습니다. AbstractFactory를 사용하면 팩토리에서 반환 된 객체의 유형을 해결하기 위해 php Storm 유형 힌트를 사용할 수 없습니다. (또는 뭔가 빠졌습니까?)
Alan Kent

8

여기에 잘못되었을 수도 있지만 이것이 내가 찾은 이점입니다.
자동 생성 된 팩토리는 매직 게터 또는 세터와 비슷합니다.
특정 엔터티의 인스턴스 (블로그 포스트라고 함)가 생성 될 때 어떤 일이 발생한다고 가정 해 봅시다. 기본값을 필드로 설정한다고 가정 해 봅시다.
모범은 좋지 않을 수도 있지만 내 말을 들으십시오.
추상 팩토리를 사용하는 경우 instanceName을 'BlogPost'매개 변수로 수신 할 때 setDate인스턴스화 후 호출하도록이를 수정해야합니다 .

자동 생성 팩토리를 사용하는 경우 나중에 해당 팩토리를 작성하고 setter코드에서를 호출 하고 생성 된 팩토리를 제거하면 작동합니다.
매직 세터로하는 것과 비슷합니다. 메소드를 구현하면 어디서나 호출됩니다.


안녕하세요 Marius. 귀하의 답변에 감사드립니다. 동의하지만 여전히 더 많은 정보가 필요합니다.
sivakumar

@sivakumar. 나는 핵심 팀원의 답변을 원합니다.
Marius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.