ข้อดีของรูปแบบโรงงาน Magento2 เหนือ Magento 1


15

Magento 2 กำลังใช้คลาสของโรงงานเพื่อไม่ให้ฉีดยา

ตัวอย่างเช่นระดับผลิตภัณฑ์: ProductFactory
ตัวอย่างเช่นชั้นลูกค้า:CustomerFactory

ฉันไม่เข้าใจรูปแบบของโรงงานที่นี่คืออะไร

เพราะสำหรับแต่ละคลาสที่เกี่ยวข้องกับ 1 คลาสจากโรงงาน ฉันคิดว่ามันเป็นสิ่งที่ซ้ำกัน ทำไมเราจึงไม่ควรสร้างโรงงานนามธรรมCustomerFactory, ProductFactoryetc?

และตัวอย่างเช่น:

เราสามารถส่งผ่านAbstractFactoryสำหรับประเภทการตรวจสอบแทนProductFactoryในการProductRepositoryสร้างคลาส

ดังนั้นเราจึงสามารถหลีกเลี่ยงข้อต่อแน่นระหว่าง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

ที่น่าสนใจ - ฉันจะได้พิจารณาวิธีอื่น ๆ ฉันต้องการให้ CustomerFactory ผ่านไปดังนั้นฉันจึงมีคำใบ้ประเภทที่ create () จะส่งคืนลูกค้า ด้วย AbstractFactory ฉันไม่สามารถใช้คำใบ้ประเภท php Storm เพื่อกำหนดประเภทของวัตถุที่ส่งคืนจากโรงงาน (หรือฉันขาดอะไรไป?)
อลันเคนต์

8

ฉันอาจจะผิดที่นี่ แต่นี่เป็นข้อได้เปรียบที่ฉันพบ
โรงงานที่สร้างขึ้นโดยอัตโนมัตินั้นมีความคล้ายคลึงกับนักมายากลหรือผู้ตั้งค่า
สมมติว่าคุณต้องการสิ่งที่จะเกิดขึ้นเมื่อมีการสร้างอินสแตนซ์ของเอนทิตีที่เฉพาะเจาะจง (เรียกว่า BlogPost) สมมติว่าคุณต้องการตั้งค่าเริ่มต้นเป็นเขตข้อมูล
ตัวอย่างอาจไม่ใช่สิ่งที่ดีที่สุด แต่ฟังฉันออกมา
หากคุณใช้โรงงานที่เป็นนามธรรมคุณจะต้องแก้ไขเพื่อให้เมื่อคุณได้รับอินสแตนซ์ชื่อเป็นพารามิเตอร์ 'BlogPost' ที่คุณเรียกใช้setDateหลังจากการสร้างอินสแตนซ์

หากคุณใช้โรงงานที่สร้างอัตโนมัติคุณสามารถสร้างโรงงานนั้นในภายหลังโทรsetterในรหัสของคุณลบโรงงานที่สร้างขึ้นและจะใช้งานได้
คล้ายกับสิ่งที่คุณทำกับนักมายากล คุณใช้วิธีการและมันถูกเรียกว่าทุกที่


สวัสดี Marius ขอขอบคุณสำหรับการตอบกลับของคุณขอให้สนุกกับคุณยังต้องการข้อมูลเพิ่มเติม
sivakumar

@sivakumar ฉันจะรักคำตอบจากสมาชิกในทีมหลักเช่นกัน
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.