Phương pháp của Nhà máy là một chuyên ngành của Phương pháp Mẫu. Làm sao?


10

Điểm tương đồng và khác biệt giữa hai:

Phương pháp mẫu

  • Dựa vào thừa kế.
  • Xác định các bước của một thuật toán và để lại nhiệm vụ triển khai chúng cho các lớp con.

Phương pháp nhà máy

  • Dựa vào thừa kế.
  • Một siêu lớp xác định một giao diện để tạo một đối tượng. Các lớp con quyết định lớp cụ thể nào để khởi tạo.

Hai bên cạnh nhau:

nhập mô tả hình ảnh ở đây

Tôi không chắc cụm từ "Phương thức nhà máy là chuyên môn hóa của Phương thức mẫu" nghĩa là gì (nó có trong sách Mẫu thiết kế đầu tiên ). Trong Beveragechúng ta có phương thức preparefinalvà định nghĩa một loạt các bước. Trong PizzaStorechúng ta có một phương thức abstract, và các lớp con xác định lại nó. Làm thế nào sau này là một chuyên môn của trước đây?


5
Tôi thấy rất nhiều downvote trên bài đăng này từ cảnh sát mẫu. Thực sự không có lý do cho điều đó; Bây giờ bạn có ba người nói rằng cụm từ này có thể không được khuyến khích. Lưu ý cho độc giả của bài đăng này: đừng tin tất cả những gì bạn đọc trong một cuốn sách hoặc trực tuyến.
Robert Harvey

Câu trả lời:


6

Trong Beveragechúng ta có phương thức ("mẫu") preparegọi một số phương thức trừu tượng như boilWater, brewv.v. được triển khai trong các lớp con. Về cơ bản, mẫu không có phương thức mẫu nằm trong lớp cơ sở, nó có thể là bất kỳ nơi nào khác, giả sử các phương thức trừu tượng là công khai. Nhưng thực chất là có các phương thức trừu tượng phải được ghi đè và sẽ lấp đầy các khoảng trống trong "mẫu thuật toán".

Phương thức nhà máy cũng là về một lớp trong đó các phương thức trừu tượng được ghi đè, điểm cốt lõi là người gọi phương thức đó không cần biết chính xác loại đối tượng được tạo. Lưu ý rằng trong PizzaStore, phương thức trừu tượng createPizzaphải được gọi ở đâu đó từ - giả sử một phương thức createLotsOfPizza.

Điều này làm cho cái sau trở thành một phương thức mẫu, trong đó các bước cụ thể của "thuật toán tạo pizza" là những khoảng trống cần được lấp đầy. Bây giờ có lẽ chỉ là cách sử dụng từ ngữ không chính xác bằng cách nói "mẫu phương thức nhà máy" là trường hợp đặc biệt của mẫu "phương thức mẫu". Đặc biệt là "phương thức nhà máy" không phải là "phương thức mẫu", tuy nhiên chúng có thể được gọi từ phương thức mẫu. Vì vậy, để chính xác hơn, chúng ta có thể nói

"mẫu phương thức nhà máy thường được sử dụng cùng với trường hợp đặc biệt của mẫu phương thức mẫu"

và tôi đoán đó là những gì các tác giả của cuốn sách đó muốn thể hiện.


2

Tôi nghĩ rằng "Phương thức nhà máy là một chuyên môn của Phương pháp mẫu" là một đặc điểm sai. Tôi tin rằng sẽ chính xác hơn khi nói rằng mẫu Phương thức mẫu chỉ là một biến thể của mẫu Phương thức nhà máy.

Hơn nữa, tôi khẳng định rằng mẫu Phương thức mẫu hoàn toàn không phải là mẫu (theo nghĩa của Gang of Four), vì nó phát sinh một cách tự nhiên thông qua tính kế thừa và ghi đè phương thức. Bạn có thể thấy rằng, trong sơ đồ trên cho Mẫu Mẫu, các lớp con cháu chỉ ghi đè các phương thức trong lớp cơ sở bằng hành vi của riêng chúng.

Nhìn chung, Mẫu phần mềm (thuộc nhóm Gang of Four) thực sự chỉ là giải pháp cho sự thiếu sót trong ngôn ngữ lập trình và Mẫu Mẫu chỉ khôi phục những ngôn ngữ hướng đối tượng vốn có khả năng.


Nếu bạn đang sử dụng định nghĩa của mẫu thiết kế làm cho Phương thức mẫu không phải là mẫu thiết kế, tôi nghĩ định nghĩa của bạn là sai. Các mẫu thiết kế là những ý tưởng trừu tượng truyền đạt mối quan hệ giữa các phần khác nhau trong mã của bạn và không liên quan gì đến ngôn ngữ mà chúng được triển khai. Các mẫu thiết kế không có chi tiết triển khai, chúng là những mô tả có thể được sử dụng ở mức cao để truyền đạt các quyết định thiết kế đã được đưa ra liên quan đến một phần của hệ thống.
Jules

Cụ thể hơn, Phương thức mẫu là một cách sử dụng kế thừa cụ thể hữu ích trong một số trường hợp, nhưng rõ ràng đó là một quyết định thiết kế vì có nhiều cách khác để đạt được cùng một mục đích (ví dụ, có thể đạt được hiệu quả tương tự, bằng cách sử dụng tổng hợp, trong trường hợp đó, nó có thể được coi là một ví dụ của mẫu Chiến lược). Cho rằng một quyết định đang được đưa ra, một cái tên rất quan trọng để cho phép chúng ta nói về quyết định đó và nơi chúng ta có một cái tên giống như đó là một mẫu thiết kế.
Jules

1

Tôi muốn nói Head First đơn giản là sai trong đặc tính này.

Wikipedia định nghĩa Phương thức mẫu là:

Trong công nghệ phần mềm, mẫu phương thức mẫu là một mẫu thiết kế hành vi xác định khung chương trình của thuật toán trong một hoạt động, trì hoãn một số bước cho các lớp con.

(Nó tham chiếu GoF cho điều đó.)

Và Phương thức nhà máy được định nghĩa là:

Trong lập trình dựa trên lớp, mẫu phương thức nhà máy là một mẫu sáng tạo sử dụng các phương thức của nhà máy để giải quyết vấn đề tạo đối tượng mà không phải chỉ định lớp chính xác của đối tượng sẽ được tạo.

Không có sự chồng chéo giữa hai cái, ngoại trừ trong C ++, sự kế thừa là một phần quan trọng của cả hai. Tuy nhiên, trong các ngôn ngữ tạo sự khác biệt giữa kế thừa triển khai ( extendstrong Java) và triển khai giao diện ( implementstrong Java), ngay cả điểm chung này cũng không tồn tại, vì thực thi giao diện là đủ cho phương thức nhà máy, nhưng không phải là phương thức mẫu. Và trong C ++, kế thừa thực hiện thuần túy (không có kế thừa giao diện, tức là thừa kế riêng hoặc CRTP) có thể được sử dụng cho cái trước, nhưng không dùng cho cái sau.

Và ngoài điều đó? Một là mẫu thiết kế hành vi, mẫu kia là mẫu sáng tạo. Một mô tả một phác thảo của một hoạt động, với một số phần chính còn lại được điền bởi các lớp con chuyên biệt; bên kia chỉ định một hợp đồng rất đơn giản, để lại toàn bộ việc thực hiện cho các trường hợp cụ thể. Chúng hoàn toàn khác biệt.

Theo tôi, dòng như trích dẫn chỉ đơn giản là sai. Hoặc đó là một lỗi rõ ràng trong cuốn sách, hoặc (ít có khả năng) nó nằm ngoài ngữ cảnh và nên được giải thích khác nhau.


Tôi nghĩ rằng tuyên bố không đơn giản là "sai", nó chỉ là một cách sử dụng từ ngữ cẩu thả. Xem chỉnh sửa của tôi.
Doc Brown
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.