Zalety fabrycznego wzoru Magento2 w porównaniu z Magento 1

15

Magento 2 używa klas fabrycznych dla produktów nie do wstrzykiwania.

Na przykład klasa produktu: ProductFactory
Na przykład klasa klienta:CustomerFactory

Nie rozumiem, jaki jest tutaj typ wzoru fabrycznego ?

Ponieważ dla każdej klasy powiązanej z 1 klasą fabryczną. Myślę, że to coś duplikatu. Dlaczego nie powinniśmy tworzyć abstrakcyjne fabrykę CustomerFactory, ProductFactoryetc?

a także na przykład:

Możemy przejść AbstractFactorydo sprawdzenia typu zamiast ProductFactoryw ProductRepositorykonstruktorze klasy.

Możemy więc uniknąć ścisłego połączenia między ProductRepositoryiProductFactory


Klasa abstrakcyjna fabryki:

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);
    }
}

Implementacja fabryki abstrakcyjnej:

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;
    }

}

Jaki jest związek między menedżerem obiektów a fabryką?

Jest tyle łańcuchów przedmiotów:

  • Na przykład ProductRepository(tutaj możemy to nazwać klientem) wymaga Productobiektu.

  • Zależy to od konkretnego ProductFactoryobiektu.

  • ProductFactoryobiekt zależy od ObjectManagerobiektu.

  • ObjectManagerobiekt zależy od obiektu fabrycznego (tutaj Developer Object).

Oczywiście używają interfejsów do luźnego łączenia. Wciąż bardzo mylący przepływ.

Czy ktoś może dać dogłębne korzyści z fabrycznym wzorem Magento 2, a także czym różni się od Magento 1?

sivakumar
źródło

Odpowiedzi:

8

Należy pamiętać, że automatycznie generujemy klasy fabryczne TYLKO JEŚLI NIE OKREŚLISZ JEDEN. Oznacza to, że jeśli potrzebujesz specjalnej magii w fabryce, możesz to zrobić. (Np. Jeśli z jakiegoś powodu chcesz rejestrować każde stworzenie instancji, napisz fabrykę, a my nie wygenerujemy jej automatycznie.) Gdybyśmy zastosowali jedną abstrakcyjną klasę fabryki do wszystkiego, to nie zadziałałoby.

Może także trochę pomóc w debugowaniu - możesz zobaczyć prawdziwą klasę, możesz ustawić punkty przerwania, zobaczyć bardziej znaczące ślady stosu itp.

Alan Kent
źródło
może być mała przerwa .. tylko do sprawdzania typu chcę użyć klasy abstrakcyjnej .. ale za każdym razem, gdy chcę przekazać konkretną klasę fabryczną.
sivakumar
Ciekawe - pomyślałbym na odwrót. Chciałbym przekazać CustomerFactory, więc mam podpowiedzi typu, że create () zwróci Customer. Dzięki AbstractFactory nie mogę używać podpowiedzi typu Storm php do obliczenia typu zwróconego obiektu z fabryki. (Czy coś mi brakuje?)
Alan Kent
8

Mogę się tutaj mylić, ale znalazłem zaletę.
Fabryki generowane automatycznie są podobne do magicznych pobieraczy lub seterów.
Załóżmy, że chcesz, aby coś się wydarzyło, gdy zostanie utworzona instancja określonej encji (nazwijmy ją BlogPost). Powiedzmy, że chcesz ustawić wartość domyślną w polu.
Przykład może nie być najlepszy, ale wysłuchaj mnie.
Jeśli korzystasz z fabryki abstrakcyjnej, musisz ją zmodyfikować, aby po otrzymaniu instancji jako parametru „BlogPost” wywoływałeś ją setDatepo utworzeniu instancji.

Jeśli używasz automatycznie generowanej fabryki, możesz później utworzyć tę fabrykę, wywołać setterkod i usunąć wygenerowaną fabrykę, a ona zadziała.
Podobne do tego, co robisz za pomocą magicznego setera. Wdrażasz metodę, która jest wywoływana wszędzie.

Marius
źródło
Cześć Marius. Dziękuję za odpowiedź. Nie zgadzam się z tobą. Nadal potrzebujesz więcej informacji.
sivakumar
@sivakumar. Chciałbym również uzyskać odpowiedź od głównego członka zespołu.
Marius