Keunggulan pola pabrik Magento2 dibanding Magento 1

15

Magento 2 menggunakan kelas pabrik untuk non-injeksi.

Misalnya kelas produk: ProductFactory
Misalnya kelas pelanggan:CustomerFactory

Saya tidak mengerti apa jenis pola pabrik di sini?

Karena untuk setiap kelas terkait dengan 1 kelas pabrik. Saya pikir ini duplikat. Kenapa kita tidak membuat pabrik abstrak untuk CustomerFactory, ProductFactorydll?

dan juga misalnya:

Kami bisa lulus AbstractFactoryuntuk memeriksa jenis bukan ProductFactorydi ProductRepositorykelas konstruktor.

Jadi kita bisa menghindari kopling ketat antara ProductRepositorydanProductFactory


Kelas pabrik abstrak:

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

Abstrak Implementasi pabrik:

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

}

Apa hubungan antara manajer objek dan pabrik?

Ada banyak objek chaining:

  • Misalnya ProductRepository(di sini kita bisa menyebutnya sebagai klien) membutuhkan Productobjek.

  • Untuk ini tergantung pada ProductFactoryobjek tertentu .

  • ProductFactoryobjek tergantung pada ObjectManagerobjek.

  • ObjectManagerobjek tergantung pada Obyek Pabrik (di sini Developer Object).

Tentu saja mereka menggunakan antarmuka untuk kopling longgar. Alurnya masih sangat membingungkan.

Dapatkah Anda memberi seseorang keuntungan mendalam dengan pola pabrik Magento 2 & juga bagaimana perbedaannya dari Magento 1?

sivakumar
sumber

Jawaban:

8

Satu hal yang perlu diingat adalah kita hanya menghasilkan kelas pabrik HANYA JIKA ANDA TIDAK MENGATAKAN SATU DIRI. Itu berarti, jika Anda perlu melakukan sihir khusus di pabrik, Anda dapat melakukannya. (Misalnya, jika Anda ingin mencatat setiap pembuatan instance karena suatu alasan, tulis sendiri pabriknya dan kami tidak akan membuatnya secara otomatis.) Jika kami menggunakan satu kelas pabrik abstrak untuk semuanya, ini tidak akan berhasil.

Ini juga dapat membantu sedikit dengan debugging - Anda dapat melihat kelas nyata, dapat mengatur breakpoints, melihat jejak tumpukan yang lebih bermakna, dll.

Alan Kent
sumber
mungkin ada celah kecil..untuk memeriksa jenis saja saya ingin menggunakan kelas abstrak..tapi setiap kali lewat saya ingin lulus kelas pabrik beton saja.
sivakumar
Menarik - saya akan mempertimbangkan sebaliknya. Saya ingin agar CustomerFactory disahkan jadi saya memiliki tip yang mengisyaratkan bahwa create () akan mengembalikan Pelanggan. Dengan AbstractFactory, saya tidak bisa menggunakan petunjuk jenis PHP Storm untuk mengetahui jenis objek yang dikembalikan dari pabrik. (Atau apakah saya kehilangan sesuatu?)
Alan Kent
8

Saya mungkin salah di sini, tetapi ini adalah keuntungan yang saya temukan.
Pabrik-pabrik yang dihasilkan secara otomatis mirip dengan getter atau setter ajaib.
Katakanlah Anda menginginkan sesuatu terjadi ketika sebuah instance dari entitas tertentu (sebut saja BlogPost) dibuat. Katakanlah Anda ingin menetapkan nilai default ke bidang.
Contohnya mungkin bukan yang terbaik tetapi dengarkan aku.
Jika Anda menggunakan pabrik abstrak, Anda harus memodifikasinya sehingga ketika Anda menerima instanceName sebagai parameter 'BlogPost' yang Anda panggil setDatesetelah instantiating.

Jika Anda menggunakan pabrik yang dibuat secara otomatis, Anda kemudian dapat membuat pabrik itu, memanggil setterkode Anda, menghapus pabrik yang dihasilkan dan itu akan bekerja.
Mirip dengan apa yang Anda lakukan dengan setter ajaib. Anda menerapkan metode dan itu disebut di mana-mana.

Marius
sumber
Hai Marius. Terima kasih atas tanggapan Anda. Setuju dengan Anda. Masih perlu informasi lebih lanjut.
sivakumar
@sivakumar. Saya ingin mendapat jawaban dari anggota tim inti juga.
Marius