Factory Method Pattern

Có nhiều developer đọc Gang Of Four và nghĩ rằng phải nhất nhất bắt chước cho giống 100% thì mới gọi là đúng. Không hề. Gang Of Four không hề tạo ra một tôn giáo và chúng ta tôn thờ ngôn ngữ đó. Khi chúng ta đọc nhiều tác giả ngoài Gang Of Four, có vẻ ngôn ngữ của họ khác với những gì GoF viết, có vẻ Factory method là 1 pattern đơn giản hơn những gì được mô tả.
Sau đây là hai cách định nghĩa thông dụng nhất
Định nghĩa một method (nằm trong interface hoặc class đều được) mang vai trò khởi tạo object
Định nghĩa một một abstract method (nằm trong interface hoặc class đều được) mang vài trò khởi tạo object, và để subclass implement
Để làm việc nhóm hiệu quả, tránh rối loạn ông nói gà bà nói vịt thì developer cần thống nhất với nhau định nghĩa của các thuật ngữ
Static factory method
Với cách định nghĩa đầu tiên, thật đơn giản chỉ là sử dụng 1 method có ngữ nghĩa tên tuổi đàng hoàng thay thế cho constructor, trong đó có thể dùng hoặc không dùng polymorphism
ví dụ về Static Factory Method:
public class Product {
private Product() {
// init data
}
public static Product createProduct() {
// do something
if (config == "A")
return new ProductA();
else
return new ProductB()
}
}
public class ProductA implements Product {}
public class ProductB implements Product {}
GoF Factory method
Đối với cách định nghĩa kiểu Gang Of Four, có lẽ mục tiêu là để re-use code khi 2 subclass chỉ khác nhau về mặt khởi tạo.
ví dụ về Factory Method bản đầy đủ:
public class Product {
public abstract Product createProduct();
public void deliver();
}
public class ProductA implements Product {
public override Product createProduct() {
return new ProductA();
}
}
public class ProductB implements Product {
public override Product createProduct() {
return new ProductB();
}
}
Lợi thế của factory method so với constructor
Khi client code trực tiếp sử dụng
new ProductA()
, sẽ xảy ra dependency từ client code đếnProductA
. Nếu chúng ta sau này cần tạoProductB
, chúng ta lại phải thay đổi client code. Việc tuân thủ Open-Closed Principle giúp hệ thống linh hoạt, dễ mở rộng với polymorphism.Đặt tên method mang ý nghĩa, expressive hơn nếu dùng constructor thông thường
Logic khởi tạo phức tạp và subclass có thể re-use một phần trong đó
Khác biệt so với Factory pattern
Factory method là một tập con của factory, và cả hai đều hỗ trợ polymorphism rất tốt.
Subscribe to my newsletter
Read articles from Anh Phan directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
