Ví dụ này trả về một đối tượng kiểu Mac
và nó không bao giờ có thể được bất cứ điều gì khác nhau:
$mac = new Mac();
Nó không thể là một lớp con của Mac
, không nó có thể là một lớp học phù hợp với giao diện của Mac
.
Trong khi ví dụ sau có thể trả lại đối tượng thuộc loại Mac
hoặc bất kỳ loại nào khác mà nhà máy quyết định là phù hợp.
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
Bạn có thể muốn một tập hợp các lớp con của Mac
, mỗi loại đại diện cho một mô hình Mac khác nhau. Sau đó, bạn viết mã trong nhà máy để quyết định sử dụng các lớp con nào. Bạn không thể làm điều đó với toán tử new
.
Vì vậy, một nhà máy cung cấp cho bạn sự linh hoạt hơn trong việc tạo đối tượng. Tính linh hoạt thường đi đôi với sự tách rời.
Re bình luận của bạn: Tôi sẽ không nói không bao giờ sử dụngnew
. Trong thực tế, tôi sử dụng new
cho phần lớn việc tạo đối tượng đơn giản. Nhưng nó không có gì để làm với những người đang viết mã khách hàng. Mẫu nhà máy là khi bạn muốn một kiến trúc có thể chọn lớp để khởi tạo động.
Trong ví dụ Apple Store, có thể bạn sẽ muốn một số mã đơn giản để tạo một sản phẩm và thêm nó vào giỏ hàng. Nếu bạn sử dụng new
và bạn có các loại đối tượng khác nhau cho từng loại sản phẩm khác nhau, bạn phải viết một tuyên bố lớn case
để bạn có thể tạo đối tượng new
thuộc loại thích hợp. Mỗi lần bạn thêm loại sản phẩm, bạn phải cập nhật câu hỏi case
đó. Và bạn có thể có một số trong số các tuyên bố này case
trong các phần khác của ứng dụng của bạn.
Bằng cách sử dụng một nhà máy, bạn sẽ chỉ có một nơi để cập nhật, biết cách lấy thông số và khởi tạo đúng loại đối tượng. Tất cả các địa điểm trong ứng dụng của bạn hoàn toàn sẽ nhận được hỗ trợ cho loại mới, không cần thay đổi mã. Đây là một chiến thắng cho dù bạn là nhà phát triển duy nhất hoặc nếu bạn đang ở trong một đội.
Nhưng một lần nữa, bạn không cần nhà máy nếu bạn không cần hỗ trợ nhiều loại phụ. Chỉ cần tiếp tục sử dụng new
trong các trường hợp đơn giản.
Nguồn
2010-04-24 05:08:31
Thứ hai dường như giống mối quan hệ hơn là một nhà máy đối với tôi ...? – SeanJA