Ưu điểm mẫu nhà máy Magento2 so với Magento 1


15

Magento 2 đang sử dụng các lớp học cho các nhà máy không tiêm.

Ví dụ lớp sản phẩm: ProductFactory
Ví dụ lớp khách hàng:CustomerFactory

Tôi không hiểu kiểu nhà máy ở đây là gì?

Bởi vì đối với mỗi lớp liên kết với 1 lớp nhà máy. Tôi đang nghĩ một cái gì đó trùng lặp. Tại sao chúng ta không nên tạo nhà máy trừu tượng cho CustomerFactory, ProductFactoryvv?

và cũng ví dụ:

Chúng ta có thể vượt qua AbstractFactoryđể kiểm tra kiểu thay vì ProductFactorytrong ProductRepositorylớp xây dựng.

Vì vậy, chúng ta có thể tránh khớp nối chặt chẽ giữa ProductRepositoryProductFactory


Lớp nhà máy trừu tượng:

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

Tóm tắt Nhà máy thực hiện:

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

}

Mối quan hệ giữa người quản lý đối tượng và nhà máy là gì?

Có rất nhiều đối tượng xích:

  • Ví dụ ProductRepository(ở đây chúng ta có thể gọi nó là client) yêu cầu Productđối tượng.

  • Đối với điều này, nó phụ thuộc vào ProductFactoryđối tượng cụ thể .

  • ProductFactoryđối tượng phụ thuộc vào ObjectManagerđối tượng.

  • ObjectManagerđối tượng phụ thuộc vào đối tượng Factory (ở đây Developer Object).

Dĩ nhiên họ đang sử dụng Giao diện cho khớp nối lỏng lẻo. Vẫn thực sự khó hiểu.

Bạn có thể cho ai đó những lợi thế sâu sắc với mẫu nhà máy Magento 2 & cũng như nó khác với Magento 1 như thế nào không?

Câu trả lời:


8

Một điều cần nhớ là chúng tôi tự động tạo các lớp xuất xưởng CHỈ NẾU BẠN KHÔNG XÁC ĐỊNH MỘT LẦN NỮA. Điều đó có nghĩa là, nếu bạn cần làm một số phép thuật đặc biệt trong nhà máy, bạn có thể làm như vậy. (Ví dụ: nếu bạn muốn ghi nhật ký mọi sáng tạo của một thể hiện vì một số lý do, hãy tự viết nhà máy và chúng tôi sẽ không tự động tạo nó.) Nếu chúng tôi sử dụng một lớp nhà máy trừu tượng duy nhất cho mọi thứ, điều này sẽ không hoạt động.

Nó cũng có thể giúp một chút với việc gỡ lỗi - bạn có thể thấy lớp thực, có thể đặt điểm dừng, xem dấu vết ngăn xếp có ý nghĩa hơn, v.v.


có thể là khoảng cách nhỏ..cho chỉ kiểm tra loại tôi muốn sử dụng lớp trừu tượng..nhưng bất cứ khi nào tôi đi qua tôi chỉ muốn vượt qua lớp nhà máy cụ thể.
sivakumar

Thú vị - tôi đã có thể xem xét theo cách khác. Tôi muốn khách hàng thông qua để tôi có gợi ý gõ rằng tạo () sẽ trả về Khách hàng. Với AbstractFactory, tôi không thể sử dụng gợi ý loại php Storm để tìm ra loại đối tượng được trả về từ nhà máy. (Hay tôi đang thiếu thứ gì đó?)
Alan Kent

8

Tôi có thể sai ở đây, nhưng đây là một lợi thế tôi tìm thấy.
Các nhà máy được tạo ra tự động là một số cách tương tự với các ma thuật hoặc setters ma thuật.
Giả sử bạn muốn điều gì đó xảy ra khi một phiên bản của một thực thể cụ thể (hãy gọi nó là BlogPost) được tạo. Giả sử bạn muốn đặt giá trị mặc định cho một trường.
Ví dụ có thể không phải là tốt nhất nhưng hãy nghe tôi nói.
Nếu bạn sử dụng một nhà máy trừu tượng, bạn sẽ phải sửa đổi nó để khi bạn nhận được instanceName làm tham số 'BlogPost', bạn gọi setDatesau khi khởi tạo.

Nếu bạn sử dụng nhà máy được tạo tự động, sau này bạn có thể tạo nhà máy đó, gọi settermã trong mã của bạn, xóa nhà máy được tạo và nó sẽ hoạt động.
Tương tự như những gì bạn làm với setter ma thuật. Bạn thực hiện phương pháp và nó được gọi ở khắp mọi nơi.


Xin chào Marius.thanks cho phản hồi của bạn. Đồng ý với bạn. Cho đến khi cần thêm thông tin.
sivakumar

@sivakumar. Tôi cũng thích một câu trả lời từ một thành viên nhóm nòng cốt.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.