Dùng PUT hay PATH trong trường hợp chúng ta chỉ định những trường nào trong DB được Update thì nó cũng ko có ý nghĩa.
Nhưng trong trường hợp để chỉ định phương thức nào cho phân quyền User hoặc thể hiện chuẩn của Restful thì nó mới có ý nghĩa.
Ông không tin vào tài liệu đấy thì tôi với ông trao đổi với nhau bằng tài liệu official của GoF Design patterns Elements of Reusable Object-Oriented Software
1. Họ (families) trong abstract factory
Diagram trên có 2 họ: Motif và PM
Có 2 class cha là Window và Scrollbar
Motif Window và Motif Scrollbar hoàn toàn khác nhau, nhưng chung 1 họ là Motif
Tương tự PM Window và PM Scrollbar hoàn toàn khác nhau nhưng chung 1 họ là PM
Như vậy mối quan hệ giữa các class con chung 1 class cha không được gọi là họ, các class khác nhau nhưng có liên quan đến nhau mới được gọi là họ.
Mục đích của abstract fatory là giải quyết vấn đề này.
Intent của abstract factory
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
Trích từ Design patterns Elements of Reusable Object-Oriented Software - GoF
Intent của factory method
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
Trích từ Design patterns Elements of Reusable Object-Oriented Software - GoF
Rõ ràng các ví dụ trên không liên quan đến một họ nào cả, mà chỉ tập trụng vào việc client không cần biết instance của class con nào được tạo, nhiệm vụ của nó là tương tác với các method của class cha cung cấp.\
Scope của Factory method: các subclass
Scope của Abstract factory: các families của các class
2. Biến thể
Như đã trình bày ở trên, diagram này là diagram tổng quát, các biến thể khác có thể tồn tại, chỉ cần nó đáp ứng được ý đồ của pattern gốc đưa ra. Các ví dụ khác hoàn toàn đáp ứng được điều này
3. Về tác giả
Alexander Shvets là tác giả của 5 cuốn sách chuyên về design pattern và best practices. Các ví dụ trên được trích từ cuốn sách Dive Into Design Patterns xuất bản lần đầu 2018, được tái bản và dịch ra nhiều ngôn ngữ khác ngoài tiếng Anh như tiếng Nhật, tiếng Trung.
Nói về độ tin cậy thì tôi đánh giá tác giả uy tín hơn ông bạn rồi. Ông có tin không nếu cuốn sách có sai sót mà vẫn tái bản nhiều lần và được rate 4.7 sao trên goods read?
Tôi cũng là subcriber của ông một thời gian rồi, đọc các bài viết của ông thấy ông có hiểu biết rất sâu về những mảng này. Nhưng lần này có thể ông có nhầm lẫn gì rồi
Bài flow fast ví dụ 2 thuật toán không đúng lắm, tác giả xem lại. Nói chung bài viết nói cũng rõ vài thứ cơ bản thôi.
Góp ý thêm với tác giả, thuật toán quan trọng nhất là chứng minh. Tác giả nên chứng minh nó đúng rồi code.
Thường mình dùng chứng minh phản chứng hoặc trao đổi (exchange argument) giống CF.
Cảm ơn tác giả
@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.
THẢO LUẬN
làm blog bằng nó cần nhiều models 0
@phatlt.unit @PhongPhamdt đúng rùi ạ, cái này mình chưa đọc kỹ. Thanks mọi người nhiều, phần phía sau có vấn đề gì không mọi người nhỉ????
Dùng PUT hay PATH trong trường hợp chúng ta chỉ định những trường nào trong DB được Update thì nó cũng ko có ý nghĩa. Nhưng trong trường hợp để chỉ định phương thức nào cho phân quyền User hoặc thể hiện chuẩn của Restful thì nó mới có ý nghĩa.
Ông không tin vào tài liệu đấy thì tôi với ông trao đổi với nhau bằng tài liệu official của GoF
Design patterns Elements of Reusable Object-Oriented Software
1. Họ (families) trong abstract factory
Diagram trên có 2 họ: Motif và PM
Có 2 class cha là Window và Scrollbar
Motif Window và Motif Scrollbar hoàn toàn khác nhau, nhưng chung 1 họ là Motif
Tương tự PM Window và PM Scrollbar hoàn toàn khác nhau nhưng chung 1 họ là PM
Như vậy mối quan hệ giữa các class con chung 1 class cha không được gọi là họ, các class khác nhau nhưng có liên quan đến nhau mới được gọi là họ.
Mục đích của abstract fatory là giải quyết vấn đề này.
Intent của abstract factory
Intent của factory method
Rõ ràng các ví dụ trên không liên quan đến một họ nào cả, mà chỉ tập trụng vào việc client không cần biết instance của class con nào được tạo, nhiệm vụ của nó là tương tác với các method của class cha cung cấp.\
Scope của Factory method: các subclass
Scope của Abstract factory: các families của các class
2. Biến thể
Như đã trình bày ở trên, diagram này là diagram tổng quát, các biến thể khác có thể tồn tại, chỉ cần nó đáp ứng được ý đồ của pattern gốc đưa ra. Các ví dụ khác hoàn toàn đáp ứng được điều này
3. Về tác giả
Alexander Shvets là tác giả của 5 cuốn sách chuyên về design pattern và best practices. Các ví dụ trên được trích từ cuốn sách Dive Into Design Patterns xuất bản lần đầu 2018, được tái bản và dịch ra nhiều ngôn ngữ khác ngoài tiếng Anh như tiếng Nhật, tiếng Trung.
Nói về độ tin cậy thì tôi đánh giá tác giả uy tín hơn ông bạn rồi. Ông có tin không nếu cuốn sách có sai sót mà vẫn tái bản nhiều lần và được rate 4.7 sao trên goods read?
Tôi cũng là subcriber của ông một thời gian rồi, đọc các bài viết của ông thấy ông có hiểu biết rất sâu về những mảng này. Nhưng lần này có thể ông có nhầm lẫn gì rồi
Một bài khá hay về System of difference constraints https://atcoder.jp/contests/agc056/tasks/agc056_c
Bài flow fast ví dụ 2 thuật toán không đúng lắm, tác giả xem lại. Nói chung bài viết nói cũng rõ vài thứ cơ bản thôi. Góp ý thêm với tác giả, thuật toán quan trọng nhất là chứng minh. Tác giả nên chứng minh nó đúng rồi code. Thường mình dùng chứng minh phản chứng hoặc trao đổi (exchange argument) giống CF. Cảm ơn tác giả
@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