@Tafi Điểm khác biệt của Factory Method và Abstract Factory là consumer sẽ viết đoạn code khởi tạo của Factory Method, còn Abstract Factory thì không, tức là người thiết kế để lại việc implement factory cho người sử dụng. Các factory này thường ở trong một ngữ cảnh cụ thể, hẹp hơn so với Abstract Factory (nhiệm vụ rõ ràng dễ hiểu hơn - để tạo instance của một họ class, mang tính tiện ích).
Các ví dụ trên không phải đều trả về các instance của một họ hay sao?
Tôi không thông thuộc về Java, nhưng với URLStreamHandlerFactory giống như một AbstractFactory hơn là FactoryMethod bởi những lý do sau:
Trả về một họ instance.
Ngữ cảnh dùng không có định. Khi nào consumer cần một streamHandler thì gọi Factory, có bản là có thể gọi bất cứ đâu.
Class chỉ có một method Factory, chỉ có nhiệm vụ làm Factory.
Đối với Calendar hay NumberFormat, các method để làm việc factory lại là static, có nghĩa không phải để thừa kế, như thế là sai rõ ràng so với biểu đồ. Các method getInstance này là AbstractFactory.
Các Factory Method thường là một abstract method trong class cha và được class con override lại, tức là class cha để việc khởi tạo một instance nào đó cho class con. Một ví dụ:
public class ReportTemplate
{
public string Render()
{
var components = GetComponents();
return ParseComponents(components);
}
protected virtual Components[] GetComponents();
}
public class AccountBalanceReportTemplate : ReportTemplate
{
protected overrides Components[] GetComponents()
{
yield return new HeaderComponent();
yield return new AccountBalanceSheetComponent();
yield return new FooterComponent();
}
}
GetComponents() là một Factory Method mà ReportTemplate ủy quyền cho các dẫn xuất của nó lựa chọn việc khởi tạo các instance của component.
Factory Method cũng có thể implement theo kiểu class bằng cách tạo ra ComponentsFactory và chúng ta implement các loại Factory khác nhau cho từng dẫn xuất của ReportTemplate như là AccountBalanceReportComponentsFactory. Khi đó có thể inject factory vào AccountBalanceReportTemplate bằng constructor, HOẶC VIẾT MỘT ABSTRACT FACTORY để tạo họ instance cho ReportTemplate (ẩn dấu đi sự phức tạp của việc khởi tạo một instance của reportTemplate).
Có thể thấy phạm vi sử dụng của Factory Method là giới hạn và gắn với context cụ thể, trong khi Abstract Factory giống như một tiện ích. ComponentsFactory thì gắn với ReportTemplate, mỗi factory được sử dụng giới hạn trong các template cụ thể. Nhưng một Abstract Factory như là ReportTemplateFactory sẽ được sử dụng ở mọi nơi mà cần đến việc sử dụng một report.
Về trang refactoring.guru, đó cũng chỉ là một trang web do vài lập trình viên lập ra. Nó có sai thì cũng không có gì lạ. Bạn có thể tham khảo nhiều nguồn hơn để hiểu rõ về Factory Method cũng như Abstract Factory.
Một số lỗi trong bài viết này đều là lỗi khi không nghiên cứu và đọc document kỹ. Chẳng hạn
Nếu bạn bật một máy ảo EC2 chạy liên tục mà quên tắt, nó sẽ chỉ miễn phí được 31,25 ngày,
và bùmmm đến tháng thứ 2 một chiếc bill tính bằng đô sẽ tới : ))
Free-tier của EC2 là 750h, một tháng.
Nếu bạn bật 1 con ec2, chạy liên tục => miễn phí được 31,25 ngày, sang tháng thứ 2 vẫn miễn phí
Nếu bạn bật 2 con ec2, chạy liên tục => miễn phí được 15,625 ngày, cuối tháng ăn bill
Chứ không phải như bạn viết
Mục tiêu của abstract factory là giải quyết các vấn đề liên quan đến một họ các concrete class, tôi không nghĩ là các ví dụ trên thuộc về Abstract factory.
Nếu không phải là factory method thì cũng không thể là abstract factory được.
Còn ví dụ về java.net.URLStreamHandlerFactory tôi thấy hoàn toàn giống với structure của Factory method, không biết tại sao ông lại cho rằng nó là một ví dụ của abstract factory
Bài viết nhầm lẫn giữa Factory Method và Abstract Factory. Các ví dụ trong bài là Abstract Factory.
Định nghĩa của Factory Method rất rõ ràng: việc tạo một instance do class con quyết định. Có nghĩa class implement Factory Method biết mình cần gì và làm gì để khởi tạo 1 instance, trong khi Abstract Factory ẩn giấu sự phức tạp của việc khởi tạo.
Anh return thẳng luôn uniqueID + i, không gọi IIFE cũng được luôn nếu khai báo let i = 0 trong for-loop, tại bản chất closure là lưu tham chiếu đến biến, mà trong vòng lặp for với let thì mỗi lần lặp nó sẽ tạo 1 binding mới (Lexical env) nên thằng closure nó sẽ tham chiếu đến binding ở từng thời điểm lặp
THẢO LUẬN
@Tafi Điểm khác biệt của Factory Method và Abstract Factory là consumer sẽ viết đoạn code khởi tạo của Factory Method, còn Abstract Factory thì không, tức là người thiết kế để lại việc implement factory cho người sử dụng. Các factory này thường ở trong một ngữ cảnh cụ thể, hẹp hơn so với Abstract Factory (nhiệm vụ rõ ràng dễ hiểu hơn - để tạo instance của một họ class, mang tính tiện ích).
Các ví dụ trên không phải đều trả về các instance của một họ hay sao?
Tôi không thông thuộc về Java, nhưng với URLStreamHandlerFactory giống như một AbstractFactory hơn là FactoryMethod bởi những lý do sau:
Đối với Calendar hay NumberFormat, các method để làm việc factory lại là static, có nghĩa không phải để thừa kế, như thế là sai rõ ràng so với biểu đồ. Các method getInstance này là AbstractFactory.
Các Factory Method thường là một abstract method trong class cha và được class con override lại, tức là class cha để việc khởi tạo một instance nào đó cho class con. Một ví dụ:
GetComponents() là một Factory Method mà ReportTemplate ủy quyền cho các dẫn xuất của nó lựa chọn việc khởi tạo các instance của component.
Factory Method cũng có thể implement theo kiểu class bằng cách tạo ra ComponentsFactory và chúng ta implement các loại Factory khác nhau cho từng dẫn xuất của ReportTemplate như là AccountBalanceReportComponentsFactory. Khi đó có thể inject factory vào AccountBalanceReportTemplate bằng constructor, HOẶC VIẾT MỘT ABSTRACT FACTORY để tạo họ instance cho ReportTemplate (ẩn dấu đi sự phức tạp của việc khởi tạo một instance của reportTemplate).
Có thể thấy phạm vi sử dụng của Factory Method là giới hạn và gắn với context cụ thể, trong khi Abstract Factory giống như một tiện ích. ComponentsFactory thì gắn với ReportTemplate, mỗi factory được sử dụng giới hạn trong các template cụ thể. Nhưng một Abstract Factory như là ReportTemplateFactory sẽ được sử dụng ở mọi nơi mà cần đến việc sử dụng một report.
Về trang refactoring.guru, đó cũng chỉ là một trang web do vài lập trình viên lập ra. Nó có sai thì cũng không có gì lạ. Bạn có thể tham khảo nhiều nguồn hơn để hiểu rõ về Factory Method cũng như Abstract Factory.
T cũng thấy cấn cấn đoạn này.
chuẩn
Một số lỗi trong bài viết này đều là lỗi khi không nghiên cứu và đọc document kỹ. Chẳng hạn
Free-tier của EC2 là 750h, một tháng. Nếu bạn bật 1 con ec2, chạy liên tục => miễn phí được 31,25 ngày, sang tháng thứ 2 vẫn miễn phí Nếu bạn bật 2 con ec2, chạy liên tục => miễn phí được 15,625 ngày, cuối tháng ăn bill Chứ không phải như bạn viết
@Clarence161095 Hay quá anh ơi ! 💯
Mục tiêu của abstract factory là giải quyết các vấn đề liên quan đến một họ các concrete class, tôi không nghĩ là các ví dụ trên thuộc về Abstract factory. Nếu không phải là factory method thì cũng không thể là abstract factory được.
Còn ví dụ về java.net.URLStreamHandlerFactory tôi thấy hoàn toàn giống với structure của Factory method, không biết tại sao ông lại cho rằng nó là một ví dụ của abstract factory
Các ví dụ còn lại, tôi cũng lấy từ tài liệu chính thức của Refactoring.guru: https://refactoring.guru/design-patterns/factory-method/java/example.
Tôi dựa vào đấy và lý giải tại sao nó được xem là factory method.
Mong ông giải thích thêm về luận điểm của mình.
Bài 2 con trỏ slow fast Dãy 4 3 3 3 4 3 k=9 Thuật toán cho ra 3.333 với dãy 4 3 3 Trong khi đáp án đúng là 3.4 với dãy con 4 3 3 3 4.
Cảm ơn bạn về bài viết
Bài viết nhầm lẫn giữa Factory Method và Abstract Factory. Các ví dụ trong bài là Abstract Factory. Định nghĩa của Factory Method rất rõ ràng: việc tạo một instance do class con quyết định. Có nghĩa class implement Factory Method biết mình cần gì và làm gì để khởi tạo 1 instance, trong khi Abstract Factory ẩn giấu sự phức tạp của việc khởi tạo.
Nếu bài viết chưa hoàn chỉnh thì nên để draft hoặc private
Bạn có thể tham khảo bài viết gốc tại đây --> link.
mình ít khi dùng some/every mà dùng filter, sau đó dựa theo length của result để xử lý
tuyệt vời
Thanks anh vì bài viết chất lượng
bài viết chi tiết nhưng mà bạn viết nhiều lỗi chính tả quá @@
nếu trong context chứa 2 bean outfit thì girl sẽ được tiêm outfit nào nhỉ? Khi có 2 class implement outfit.
test cmt
Bạn ơi ra phần 2 chưa
Anh return thẳng luôn uniqueID + i, không gọi IIFE cũng được luôn nếu khai báo let i = 0 trong for-loop, tại bản chất closure là lưu tham chiếu đến biến, mà trong vòng lặp for với let thì mỗi lần lặp nó sẽ tạo 1 binding mới (Lexical env) nên thằng closure nó sẽ tham chiếu đến binding ở từng thời điểm lặp
Đồng ý luôn, mình từng làm cả 2 dự án và thực tế Bloc để làm màu xịn hơn GetX. Chỉ có vậy thôi!