2010-04-24 35 views
6

Tôi đang cố hiểu mô hình thiết kế của nhà máy.lợi ích của việc có một nhà máy để tạo đối tượng?

Tôi không hiểu tại sao nên có một người trung gian giữa khách hàng và sản phẩm (đối tượng mà khách hàng muốn).

dụ không có nhà máy:

$mac = new Mac(); 

ví dụ với một nhà máy:

$appleStore = new AppleStore(); 
$mac = $appleStore->getProduct('mac'); 

Làm thế nào để mô hình nhà máy tách các khách hàng từ các sản phẩm?

Ai đó có thể đưa ra ví dụ về thay đổi mã trong tương lai sẽ tác động đến ví dụ 1 tiêu cực, nhưng tích cực trong ví dụ 2 để tôi hiểu tầm quan trọng của việc tách?

Cảm ơn.

+1

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

Trả lời

5

tôi nghĩ rằng nó đã làm với các nguồn lực cần thiết để xây dựng một số loại đối tượng.

Không chính thức, nếu bạn nói với ai đó để xây dựng một máy Mac, nó sẽ là một quá trình siêng năng sẽ mất nhiều năm thiết kế, phát triển, sản xuất và thử nghiệm, và nó có thể không được thực hiện đúng. Quá trình này sẽ phải được lặp lại cho mọi máy Mac. Tuy nhiên, nếu bạn giới thiệu một nhà máy, tất cả các công việc khó khăn có thể được thực hiện chỉ một lần, sau đó máy Mac có thể được sản xuất rẻ hơn.

Bây giờ hãy xem xét Joomla factory.php. Từ những gì tôi có thể nói, mục đích chính của JFactory là để bơi các đối tượng và đảm bảo rằng các đối tượng phải giống nhau không được sao chép. Ví dụ: JFactory::getUser() sẽ trả về một tham chiếu đến một và chỉ một đối tượng. Nếu một cái gì đó được thay đổi trong đối tượng người dùng đó, nó sẽ xuất hiện ở khắp mọi nơi. Ngoài ra, lưu ý rằng JFactory::getUser() trả về một tham chiếu chứ không phải đối tượng mới. Đó là một cái gì đó bạn chỉ đơn giản là không thể làm với một nhà xây dựng.

Thông thường, bạn cần bối cảnh cục bộ khi xây dựng một đối tượng và bối cảnh đó có thể tồn tại và có thể có nhiều hình thức. Ví dụ, có thể có một cơ sở dữ liệu MySQL đang nắm giữ người dùng. Nếu các đối tượng User được tạo ra với một hàm tạo, bạn sẽ cần phải truyền một đối tượng Cơ sở dữ liệu tới hàm tạo (hoặc có nó dựa trên một biến toàn cục). Nếu bạn quyết định chuyển ứng dụng của mình sang PostgreSQL, ngữ nghĩa của đối tượng Cơ sở dữ liệu có thể thay đổi, gây ra tất cả các cách sử dụng của hàm tạo cần xem xét. Các biến toàn cầu cho phép chúng ta che giấu các chi tiết đó và các nhà máy cũng vậy. Do đó, một nhà máy người dùng sẽ tách các chi tiết của việc xây dựng các đối tượng User từ những nơi mà các đối tượng User cần thiết.

Khi nào các nhà máy hữu ích? Khi xây dựng một đối tượng liên quan đến các chi tiết nền. Khi nào các nhà thầu tốt hơn? Khi các biến toàn cục đủ.

+1

+1 tiền thưởng tương tự – SeanJA

+0

nhưng không được gọi là "quá trình di chuyển đến vị trí trung tâm". những gì tôi không hiểu là từ decouple. –

+0

nhưng nếu tôi cần thay đổi cơ sở dữ liệu và sử dụng nhà máy, tôi vẫn phải thay đổi mã của mình trong nhà máy. đó là phần tôi không hiểu lắm. hoặc là tôi phải thay đổi, bây giờ tôi chỉ chuyển nó sang một lớp khác, nhà máy. tôi có thể hiểu rằng điều này là tốt nếu giao dịch với các ứng dụng khung/os. người dùng của bạn tương tác với mã của bạn không phải viết lại mã của họ. nhưng nếu im là người duy nhất đang sử dụng mã tôi viết, làm thế nào là nhà máy tốt hơn? tôi vẫn phải thay đổi nếu tôi thay đổi cơ sở dữ liệu. –

1

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.

+0

vì vậy tập trung vào "làm thế nào tôi có thể viết mã để bất cứ khi nào tôi thay đổi mã MY, CLIENT không phải"? vì vậy về cơ bản tôi KHÔNG BAO GIỜ muốn khách hàng sử dụng mới trên "sản phẩm cuối cùng". tôi muốn cung cấp một lớp trừu tượng (nhà máy) để tạo ra sản phẩm. cho nên anh ta không biết điều gì xảy ra đằng sau hậu trường? Tôi có đúng không? nhưng những gì về khi tôi mã tất cả mọi thứ bản thân mình? một trong hai cách, tôi phải thay đổi. tôi không hoàn toàn hiểu nơi tập trung nằm hoặc những gì tôi là một nhà phát triển muốn làm. –

Các vấn đề liên quan