Nằm trong series những bài viết giải thích và minh họa cách sử dụng các Design Pattern trong lập trình.
Bài viết này, mình sẽ giới thiệu với các bạn một Design Pattern tương đối phổ biến trong các dự án, đó là Factory Method.
Nếu bạn là người mới, chưa biết Design Pattern là gì, mời bạn đọc lại bài viết này nhé: Design Pattern là gì?
Nội dung chính của bài viết
Factory Method là gì?
Trong lập trình hướng đối tượng, Factory Method là giải pháp giúp bạn giải quyết vấn đề tạo đối tượng mà không cần chỉ định chính xác lớp của đối tượng cần tạo.
Định nghĩa thì nó trừu tượng như vậy thôi, chứ chúng ta cứ hiểu nôm na là Factory Method giống như một nhà máy, chỉ cần đưa yêu cầu cần tạo vào, nó tự động chọn lựa và trả về đối tượng tương ứng, bạn sẽ không cần quan tâm nó khởi tạo như nào, switch case hay nhào lặn ra sao!
Ví dụ sinh động nhất mà mình thấy nó phù hợp với pattern này như hình dưới đây:
Khi nào sử dụng Factory Method Pattern?
Mục tiêu chính của Factory Method là khả năng mở rộng. Do vậy, pattern này thường được sử dụng trong các ứng dụng quản lý, thao tác với nhiều đối tượng khác nhau nhưng chúng lại có nhiều đặc điểm chung.
Ví dụ: bạn có một trình đọc đọc tài liệu mà hỗ trợ nhiều loại tài liệu khác nhau như XML, PDF, DOC… tương ứng với mỗi loại tài liệu, bạn sẽ khởi tạo đối tượng trình đọc tương ứng.
Thực hành viết code minh họa
Để dễ hình dung hơn về pattern này, chúng ta sẽ cùng nhau xem xét một ví dụ minh họa sau:
Viết một chương trình quản lý nhân viên trong công ty. Với mỗi loại nhân viên sẽ có mức lương khác nhau: Nhân viên fulltime, partime, thuê lại.v.v… Mỗi khi tuyển dụng được một nhân viên mới, chương trình sẽ tự động tạo nhân viên cùng với mức lương tương ứng.
Trong ví dụ này, đối tượng Factory sẽ tạo ra 4 loại nhân viên khác nhau: fulltime, parttime, temporary, contractor
. Mỗi loại nhân viên sẽ có mức lương theo giờ khác nhau. Hàm createEmployee()
chính là một thể hiện thực tế của Factory Method Pattern.
Khi cần tạo mới một nhân viên, chỉ cần truyền vào loại nhân viên vào Factory Method.
var Factory = function () { this.createEmployee = function (type) { var employee; if (type === "fulltime") { employee = new FullTime(); } else if (type === "parttime") { employee = new PartTime(); } else if (type === "temporary") { employee = new Temporary(); } else if (type === "contractor") { employee = new Contractor(); } employee.type = type; employee.say = function () { console.log(this.type + ": rate " + this.hourly + "/hour"); } return employee; } } var FullTime = function () { this.hourly = "$12"; }; var PartTime = function () { this.hourly = "$11"; }; var Temporary = function () { this.hourly = "$10"; }; var Contractor = function () { this.hourly = "$15"; }; function run() { var employees = []; var factory = new Factory(); employees.push(factory.createEmployee("fulltime")); employees.push(factory.createEmployee("parttime")); employees.push(factory.createEmployee("temporary")); employees.push(factory.createEmployee("contractor")); for (var i = 0, len = employees.length; i < len; i++) { employees[i].say(); } }
Kết quả khi chạy chương trình như sau:
Tái bút: Pattern này cũng dễ phải không nhỉ? Nếu dự án của bạn không sử dụng Javascript, mình rất mong bạn chia sẻ cách implement của pattern này bằng ngôn ngữ mà bạn đang sử dụng, đừng ngại để lại bình luận bên dưới nhé.
💦 Đọc thêm:
Bình luận. Cùng nhau thảo luận nhé!