Có ai có thể giải thích sự khác biệt giữa mô hình nhà máy và chiến lược không?
Đối với tôi cả hai đều trông giống nhau ngoài một lớp nhà máy bổ sung (tạo ra một đối tượng của sản phẩm trong các mẫu của nhà máy)
Có ai có thể giải thích sự khác biệt giữa mô hình nhà máy và chiến lược không?
Đối với tôi cả hai đều trông giống nhau ngoài một lớp nhà máy bổ sung (tạo ra một đối tượng của sản phẩm trong các mẫu của nhà máy)
Câu trả lời:
Một mô hình nhà máy là một mô hình sáng tạo. Một mô hình chiến lược là một mô hình hoạt động. Nói cách khác, một mô hình nhà máy được sử dụng để tạo các đối tượng của một loại cụ thể. Một mẫu chiến lược được sử dụng để thực hiện một hoạt động (hoặc tập hợp các hoạt động) theo một cách cụ thể. Trong ví dụ cổ điển, một nhà máy có thể tạo ra các loại Động vật khác nhau: Chó, Mèo, Hổ, trong khi một mẫu chiến lược sẽ thực hiện các hành động cụ thể, ví dụ: Di chuyển; sử dụng chiến lược Run, Walk hoặc Lope.
Trong thực tế, cả hai có thể được sử dụng cùng nhau. Ví dụ: bạn có thể có một nhà máy tạo ra các đối tượng kinh doanh của bạn. Nó có thể sử dụng các chiến lược khác nhau dựa trên phương tiện kiên trì. Nếu dữ liệu của bạn được lưu trữ cục bộ trong XML, nó sẽ sử dụng một chiến lược. Nếu dữ liệu ở xa trong một cơ sở dữ liệu khác, nó sẽ sử dụng dữ liệu khác.
Mẫu chiến lược cho phép bạn thay đổi đa hình hành vi của một lớp.
Mẫu nhà máy cho phép bạn đóng gói việc tạo đối tượng.
Gary làm cho một điểm tuyệt vời. Nếu bạn đang sử dụng nguyên tắc mã hóa để trừu tượng hơn là "cụ thể hóa" thì rất nhiều mẫu bắt đầu trông giống như các biến thể của một chủ đề.
Chỉ cần thêm vào những gì tvanfosson nói, rất nhiều mô hình trông giống như khi thực hiện. Đó là, rất nhiều bạn đã tạo ra một giao diện mà có lẽ trước đây không có giao diện nào trong mã của bạn, và sau đó tạo ra một loạt các triển khai của giao diện đó. Sự khác biệt là trong mục đích của chúng và cách chúng được sử dụng.
Chỉ tạo các trường hợp cụ thể. Các đối số khác nhau có thể dẫn đến các đối tượng khác nhau. Nó phụ thuộc vào logic, vv
Đóng gói thuật toán (các bước) để thực hiện một hành động. Vì vậy, bạn có thể thay đổi chiến lược và sử dụng thuật toán khác.
Mặc dù cả hai trông rất giống nhau, mục đích khá khác nhau, một mục đích là tạo ra mục đích khác là thực hiện một hành động.
Vì thế. Nếu phương thức Factory của bạn là cố định, bạn có thể có nó như thế này:
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
Nhưng giả sử nhà máy của bạn cần sáng tạo tiên tiến hơn hoặc năng động hơn. Bạn có thể thêm vào phương thức nhà máy một chiến lược và thay đổi nó mà không cần phải biên dịch lại, chiến lược có thể thay đổi khi chạy.
Trước hết, một sự khác biệt giữa nhà máy đơn giản và nhà máy trừu tượng phải được thực hiện. Cái đầu tiên là một nhà máy đơn giản, trong đó bạn chỉ có một lớp hoạt động như một nhà máy để tạo đối tượng, trong khi ở nhà máy sau bạn kết nối với một giao diện nhà máy (xác định tên phương thức) và sau đó gọi các nhà máy khác thực hiện giao diện này được cho là có các triển khai khác nhau của cùng một phương pháp dựa trên một số tiêu chí. Ví dụ: chúng tôi có giao diện ButtonCreationFactory, được triển khai bởi hai nhà máy, WindowsButtonCreationFactory đầu tiên (tạo các nút có giao diện Windows) và LinuxButtonCreationFactory (tạo các nút có giao diện Linux). Vì vậy, cả hai nhà máy này đều có cùng một phương pháp tạo với các triển khai (thuật toán) khác nhau.
Ví dụ: nếu bạn muốn các nút có giao diện Linux:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
hoặc nếu bạn muốn các nút Windows
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
Chính xác trong trường hợp này, nó dẫn đến một loại mô hình chiến lược, vì nó phân biệt các thuật toán để thực hiện một số sáng tạo. Tuy nhiên, nó khác với nó về mặt ngữ nghĩa bởi vì nó được sử dụng cho TẠO ĐỐI TƯỢNG hơn là các thuật toán hoạt động. Vì vậy, về cơ bản với nhà máy trừu tượng, bạn có việc tạo đối tượng bằng các chiến lược khác nhau, điều này làm cho nó rất giống với mô hình chiến lược. Tuy nhiên, AbstractFactory là sáng tạo, trong khi mẫu Chiến lược đang hoạt động. Thực hiện khôn ngoan, kết quả là như nhau.
Factory (và FactoryMethod được trả lại bởi Factory) :
Hãy xem bài viết trên wikipedia và bài viết javarevisited này
Mô hình chiến lược:
Thí dụ:
Bạn có thể định cấu hình chiến lược Giảm giá cho một mặt hàng cụ thể (vé AirFare hoặc mặt hàng ShoppingCart). Trong ví dụ này, bạn sẽ giảm giá 25% cho một mặt hàng trong tháng 7 - 12 và không giảm giá cho mặt hàng đó trong Jaunary - tháng 6.
Bài viết liên quan:
Ví dụ thực tế về mô hình chiến lược
Mẫu thiết kế: Phương pháp Factory vs Factory vs Tóm tắt Factory
Để mở rộng những gì Oscar nói và liên quan đến mã của anh ấy:
GetCommand là các lớp Factory và UnixCommand, WindowsCommand và OSXCommand là Strategies
Mẫu chiến lược theo thuật ngữ đơn giản là nhiều hơn về việc tạo hành vi trong thời gian chạy mà bạn không quan tâm đến lớp triển khai. Mặt khác, nhà máy đang tạo thời gian chạy tạo cá thể lớp cụ thể và bạn phải sử dụng bất kỳ hành vi (phương thức) nào được hiển thị bởi giao diện đã triển khai.
Bạn không thể hiểu sự khác biệt đơn giản bằng cách nhìn vào mã hoặc phân loại. Để nắm bắt chính xác các mẫu GoF, hãy tìm ý định của chúng:
Chiến lược: "Xác định một họ các thuật toán, gói gọn từng thuật toán và làm cho chúng có thể thay thế cho nhau. Chiến lược cho phép thuật toán thay đổi độc lập với các máy khách sử dụng nó."
Phương thức Factory: "Xác định giao diện để tạo đối tượng, nhưng hãy để các lớp con quyết định lớp nào sẽ khởi tạo. Phương thức Factory cho phép một lớp trì hoãn khởi tạo lớp đối với các lớp con."
Và đây là một lời giải thích công phu về ý định và sự khác biệt giữa hai mẫu này: Sự khác biệt giữa các mẫu thiết kế Chiến lược và Phương pháp của Nhà máy
Tôi có thể lạc đề với Oscar rằng ví dụ về việc triển khai Nhà máy của anh ấy khá chặt chẽ và rất kín, không có gì lạ khi lựa chọn của bạn là mô hình Chiến lược. Việc triển khai Factory không nên phụ thuộc vào bất kỳ số lượng cố định nào của các lớp cụ thể được khởi tạo, Ví dụ:
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
Tôi đoán các tiêu chí phù hợp nhất để chọn cái này hay cái khác chủ yếu là các thuật ngữ bạn sử dụng để đặt tên cho các lớp và phương thức của bạn, có tính đến tất cả chúng ta nên có xu hướng lập trình cho các giao diện chứ không phải các lớp và cũng tập trung vào mục tiêu: chúng tôi nhắm đến để xác định mã nào sẽ thực thi trong thời gian chạy. Điều đó nói rằng, chúng ta có thể đạt được mục tiêu bằng cách sử dụng bất kỳ cả hai mẫu.
Chiến lược và Nhà máy là những mục đích khác nhau. Trong chiến lược bạn có cách tiếp cận được xác định, sử dụng mẫu này bạn có thể trao đổi hành vi (thuật toán). Đến với Factory có rất nhiều biến thể xung quanh. Nhưng mẫu ban đầu từ GO4 cho biết nhà máy để lại việc tạo đối tượng cho lớp con. Ở đây với nhà máy bạn đang thay thế hoàn toàn không phải là hành vi mà bạn quan tâm. Bằng cách này, bạn sẽ thay thế hệ thống hoàn chỉnh chứ không phải thuật toán.
Mẫu nhà máy là một mẫu sáng tạo, được tạo với các thuộc tính (hành vi) được chỉ định. trong khi tại thời điểm chạy sau khi tạo, bạn không thay đổi thuộc tính (hành vi). Vì vậy, nếu bạn cần các thuộc tính (hành vi) khác nhau, bạn phải xóa đối tượng và tạo đối tượng mới với các thuộc tính (hành vi) cần thiết. đó không phải là gud. trong khi trong trường hợp mẫu chiến lược u có thể thay đổi các thuộc tính (hành vi) trong thời gian chạy.