Magento2 Factory Pattern Vorteile gegenüber Magento 1


15

Magento 2 verwendet Factory-Klassen für nicht injizierbare Produkte.

Zum Beispiel Produktklasse: ProductFactory
Zum Beispiel Kundenklasse:CustomerFactory

Ich verstehe nicht, was hier für ein Fabrikmuster vorliegt .

Denn für jede Klasse mit 1 Werksklasse verbunden. Ich denke, es ist etwas doppeltes. Warum sollen wir nicht abstraktes Werk schaffen CustomerFactory, ProductFactoryetc?

und auch zum Beispiel:

Wir können AbstractFactoryzur Typprüfung anstatt ProductFactoryim ProductRepositoryKlassenkonstruktor übergeben.

So können wir eine enge Kopplung zwischen ProductRepositoryund vermeidenProductFactory


Abstrakte Factory-Klasse:

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

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

}

Wie ist die Beziehung zwischen Objektmanager und Fabrik?

Es gibt so viel Verkettung von Objekten:

  • Zum Beispiel ProductRepository(hier können wir es als Client bezeichnen) erfordert ProductObjekt.

  • Dies hängt vom jeweiligen ProductFactoryObjekt ab.

  • ProductFactoryObjekt hängt vom ObjectManagerObjekt ab.

  • ObjectManagerObjekt hängt vom Factory-Objekt ab (hier Developer Object).

Natürlich verwenden sie Schnittstellen für die lose Kopplung. Immer noch sehr verwirrend.

Kann Ihnen jemand detaillierte Vorteile mit Magento 2 Factory Pattern geben und auch, wie es sich von Magento 1 unterscheidet?

Antworten:


8

Beachten Sie, dass wir Factory-Klassen nur dann automatisch generieren, wenn Sie sich nicht selbst definieren. Das heißt, wenn Sie in der Fabrik besondere Magie benötigen, können Sie dies tun. (Wenn Sie beispielsweise aus irgendeinem Grund jede Erstellung einer Instanz protokollieren möchten, schreiben Sie die Factory selbst und wir generieren sie nicht automatisch.) Wenn wir für alles eine einzelne abstrakte Factory-Klasse verwenden, würde dies nicht funktionieren.

Es kann auch ein bisschen beim Debuggen helfen - Sie können die reale Klasse sehen, Haltepunkte setzen, aussagekräftigere Stack-Traces sehen usw.


kann eine kleine Lücke sein ... nur für die Typprüfung möchte ich eine abstrakte Klasse verwenden ... aber wann immer ich übergebe, möchte ich nur eine konkrete Fabrikklasse übergeben.
Sivakumar

Interessant - ich hätte umgekehrt gedacht. Ich möchte, dass CustomerFactory übergeben wird, damit ich Tippe, dass create () den Kunden zurückgibt. Mit AbstractFactory kann ich keinen PHP-Storm-Typ verwenden, um den Typ des zurückgegebenen Objekts aus der Factory zu ermitteln. (Oder vermisse ich etwas?)
Alan Kent

8

Ich kann mich hier irren, aber das ist ein Vorteil, den ich gefunden habe.
Die automatisch generierten Fabriken ähneln den magischen Gettern oder Setzern.
Angenommen, Sie möchten, dass etwas passiert, wenn eine Instanz einer bestimmten Entität (nennen wir es BlogPost) erstellt wird. Angenommen, Sie möchten einen Standardwert für ein Feld festlegen.
Das Beispiel ist vielleicht nicht das beste, aber höre mich an.
Wenn Sie eine abstrakte Factory verwenden, müssen Sie diese so ändern, dass Sie sie setDatenach der Instanziierung aufrufen, wenn Sie den Instanznamen als Parameter 'BlogPost' erhalten .

Wenn Sie eine automatisch settergenerierte Factory verwenden, können Sie diese Factory später erstellen, den Code in Ihrem Code aufrufen , die generierte Factory entfernen und sie wird funktionieren.
Ähnlich wie mit dem Zaubersetzer. Sie implementieren die Methode und sie wird überall aufgerufen.


Hallo Marius. Vielen Dank für Ihre Antwort. Ich bin mit Ihnen einverstanden. Benötige noch weitere Informationen.
Sivakumar

@sivakumar. Ich würde mich auch über eine Antwort von einem Kernteammitglied freuen.
Marius
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.