Factory Pattern là gì?
Factory Method Design Pattern, hay còn được gọi là Factory Pattern là một trong những Pattern phổ biến trong lập trình hướng đối tượng.
Factory Pattern thuộc nhóm Creational Design Pattern (mẫu khởi tạo). Vì nhiệm vụ của mẫu này là quản lý và trả về các đối tượng theo yêu cầu, cung cấp một trong những cách tốt nhất để tạo một đối tượng. Giúp cho việc khởi tạo đối tượng một cách linh hoạt hơn.
Factory pattern là một trong những mẫu thiết kế được sử dụng nhiều nhất trong Java.
Trong Factory Pattern, chúng ta tạo đối tượng mà không để lộ logic tạo đối tượng ở phía người dùng và tham chiếu đến đối tượng mới được tạo ra bằng cách sử dụng một interface chung.
Một định nghĩa bằng tiếng anh nguyên bản như sau:
“Factory Method is a creational design pattern that Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.”
Factory Design Pattern có lợi ích gì?
- Giúp việc khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đó. Người dùng không biết logic thực sự được khởi tạo bên dưới phương thức factory.
- Mẫu thiết kế này cho phép các lớp con chọn kiểu đối tượng cần tạo.
- Nó thúc đẩy sự liên kết lỏng lẻo bằng cách loại bỏ sự cần thiết phải ràng buộc các lớp cụ thể vào code. Nghĩa là code chỉ tương tác với interface hoặc lớp abstract, để nó sẽ làm việc với bất kỳ lớp nào implements interface đó hoặc extends lớp abstract.
- Factory Pattern giúp giảm sự phụ thuộc giữa các module: cung cấp 1 hướng tiếp cận với Interface thay vì các implement. Giúp chuơng trình độc lập với những lớp cụ thể mà chúng ta cần tạo 1 đối tượng, code ở phía client sẽ không bị ảnh hưởng khi thay đổi logic ở factory hay sub class.
- Việc mở rộng code dễ dàng hơn: khi cần mở rộng, chỉ việc tạo ra những sub class và implement thêm vào factory method.
- Dễ dạng quản lý life cycle của các Object được tạo bởi Factory Method Pattern.
- Thống nhất về mặt naming convention: giúp cho các developer có thể hiểu về cấu trúc source code.
Áp dụng vào đâu
- “Factory method” thường được sử dụng trong việc thiết kế toolkit hay framework, đoạn mã của framework cần thiết phải tạo ra một đối tượng là những lớp con tương ứng tăng tính mềm dẻo trong sử dụng framework đó.
- Cách sử dụng, khi nào bạn nên sử dụng mẫu thiết kế Factory Method.
Mẫu thiết kế này sẽ phát huy được ưu điểm của nó trong một số trường hợp sau:
- Khi bạn chưa biết nên khởi tạo đối tượng mới từ class nào.
- Khi bạn muốn tập trung các đoạn code liên quan đến việc khởi tạo các đối tượng mới về cùng một nơi để dễ dàng cho những thao tác và xử lý.
- Khi bạn không muốn người dùng phải biết hết tên của các class có liên quan đến quá trình khởi tạo cũng như muốn che giấu, đóng gói toàn bộ logic của quá trình khởi tạo một đối tượng mới nào đó khỏi phía người dùng.
Ưu điểm và nhược điểm của Factory Method Pattern
Một số ưu, nhược điểm của pattern này.
Ưu điểm
- Factory Method Pattern giúp hạn chế sự phụ thuộc giữa creator và concrete products.
- Factory Method Pattern giúp gom các đoạn code tạo ra product vào một nơi trong chương trình, nhờ đó giúp dễ theo dõi và thao tác.
- Với Pattern này, chúng ta có thể dễ dàng mở rộng, thêm những đoạn code mới vào chương trình mà không cần phá vỡ các đối tượng ban đầu.
Nhược điểm
Ngoài những ưu điểm nên trên thì mẫu thiết kế này cũng có nhược điểm như sau:
Mã code có thể trở nên phức tạp hơn mức bình thường do đòi hỏi phải sử dụng nhiều class mới có thể cài đặt được pattern này.
Nên sử dụng Factory Pattern khi nào?
Dựa vào những lợi ích của việc sử dụng Factory pattern mà ta sẽ dùng chung với một số mục đích sau:
- Khi bạn cần tạo các phiên bản khác nhau tùy thuộc vào môi trường
- Khi bạn đang làm việc với nhiều đối tượng nhỏ có cùng thuộc tính
- Khi kết hợp các lớp với các thể hiện của các lớp khác chỉ cần thỏa mãn một yêu cầu nào đó
Mục đích sử dụng
Tại sao chúng ta lại phải dùng Factory pattern thay cho việc khởi tạo đối tượng thông thường? Dùng Factory pattern có lợi ích gì?
Factory pattern đưa ra 1 ý tưởng mới cho việc khởi tạo các instance phù hợp với mỗi yêu cầu từ phía Client. Sử dụng Factory pattern sẽ có những ưu điểm sau:
- Tạo ra 1 cách mới trong việc khởi tạo Object thông qua 1 interface chung.
- Khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đấy.
- Giảm sự phụ thuộc giữa các module, các logic với các class cụ thể. Mà chỉ phụ thuộc vào interface hoặc abstract class.
Ví dụ về Factory Pattern
Giải sử: Công ty X có nhiều bộ phận riêng biệt đi. Khi cần thêm mới 1 nhân viên mới chỉ cần dữ liệu đầu vào là họ và tên và type để phân biệt bộ phận.
// Factory Pattern
// Team Front-End
function FrontEnd(name) {
this.name = name;
this.type = "FrontEnd";
}
//Team Back-End
function Backend(name) {
this.name = name;
this.type = "Backend";
}
// type=1 là Front End 2 là Back-End
class DeveloperFacetory {
create(name, type) {
switch (type) {
case 1:
return new FrontEnd(name);
case 2:
return new Backend(name);
}
}
}
const listMembers = [];
const Developer = new DeveloperFacetory();
listMembers.push(
Developer.create("Huy Nguyễn", 1),
Developer.create("Hàn Nanm", 2),
Developer.create("Hoài Nghĩa", 2),
Developer.create("Hoài Nanm", 1),
Developer.create("Độ Han", 2),
Developer.create("Hoài Khang", 1),
Developer.create("Hiu Trí", 1)
);
function showInfo() {
console.log(`Hello ${this.name} is a ${this.type} developer❤️👈👈`);
}
listMembers.forEach((member) => showInfo.apply(member));
// ->>>>>>>>>>>>> Kết quả
// Hello Huy Nguyễn is a FrontEnd developer❤️👈👈
// Hello Hàn Nanm is a Backend developer❤️👈👈
// Hello Hoài Nghĩa is a Backend developer❤️👈👈
// Hello Hoài Nanm is a FrontEnd developer❤️👈👈
// Hello Độ Han is a Backend developer❤️👈👈
// Hello Hoài Khang is a FrontEnd developer❤️👈👈
// Hello Hiu Trí is a FrontEnd developer❤️👈👈
Kết luận
Trong bài viết này, chúng ta đã cùng nhau tìm hiểu về Factory Pattern là gì, ví dụ cụ thể. Hy vọng pattern này sẽ giúp ích cho các bạn trong tương lai. Mong các bạn để lại những ý kiến để bài viết được hoàn thiện hơn nữa.




![[React JS] Sức mạnh của react-query](/_next/image?url=https%3A%2F%2Fviblo.asia%2Fog-facebook-3.png&w=640&q=75)
