Magento2のMagento2ファクトリーパターンの利点1


15

Magento 2は、注射不可のファクトリクラスを使用しています。

たとえば製品クラス:ProductFactory
たとえば顧客クラス:CustomerFactory

私はここで工場パターンタイプが何であるか理解できませんか?

1つのファクトリクラスに関連付けられている各クラスのため。私はその何かが重複していると考えています。 なぜ私たちはのための抽象工場作成するべきではないCustomerFactoryProductFactoryなど?

また、たとえば:

私たちは、渡すことができます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

覚えておくべきことの1つは、自分自身を定義しない場合にのみファクトリクラスを自動生成することです。つまり、工場で特別な魔法を行う必要がある場合は、そうすることができます。(たとえば、何らかの理由でインスタンスの作成ごとにログを記録する場合は、自分でファクトリを記述してください。自動生成は行いません。)すべてに対して単一の抽象ファクトリクラスを使用した場合、これは機能しません。

また、デバッグに少し役立ちます-実際のクラスを確認したり、ブレークポイントを設定したり、より意味のあるスタックトレースを確認したりできます。


小さなギャップかもしれません..型チェックのためだけに抽象クラスを使用したいのですが、渡すたびに具体的なファクトリークラスのみを渡したいです。
sivakumar

興味深い-私は他の方法を考えたでしょう。CustomerFactoryを渡してほしいので、create()がCustomerを返すというタイプのヒントがあります。AbstractFactoryでは、ファクトリから返されたオブジェクトのタイプを解決するためにphp Stormタイプヒントを使用できません。(または何かが足りない?)
アランケント

8

私はここで間違っているかもしれませんが、これは私が見つけた利点です。
自動生成されたファクトリーは、マジックゲッターまたはセッターと多少似ています。
特定のエンティティのインスタンス(BlogPostと呼びます)が作成されたときに何かを発生させたいとします。フィールドにデフォルト値を設定するとします。
例は最良ではないかもしれませんが、私に聞いてください。
抽象ファクトリーを使用する場合は、インスタンス名をパラメーター「BlogPost」として受け取ったときsetDateにインスタンス化後に呼び出すように、それを変更する必要があります。

自動生成されたファクトリを使用する場合は、後でそのファクトリを作成setterし、コードでを呼び出し、生成されたファクトリを削除すると機能します。
マジックセッターで行う操作に似ています。メソッドを実装すると、どこでも呼び出されます。


こんにちはマリウス。あなたの応答に感謝します。あなたに同意します。さらに情報が必要です。
sivakumar

@sivakumar。コアチームのメンバーからの回答もお待ちしています。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.