Tổng hợp Design Pattern - Factory Pattern là gì?

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.

quản trị viên

Chia sẻ bài viết:

Tin tức liên quan

Cách sử dụng Async Await Fetch Axios trong lập trình JavaScript

Cách sử dụng Async Await Fetch Axios trong lập trình JavaScript

Trong lập trình JavaScript, async/await và fetch/axios là những khái niệm quan trọng giúp xử lý các tác vụ bất đồng bộ một cách dễ dàng và hiệu quả. Trên thực tế, chúng đã trở thành tiêu chuẩn cho việc làm việc với API và tương tác với dữ liệu từ máy chủ. Trong bài viết này, chúng ta sẽ khám phá sâu hơn về async/await, fetch, axios và cách chúng hoạt động trong lập trình JavaScript.

[React JS] Sức mạnh của react-query

[React JS] Sức mạnh của react-query

React Query là một thư viện phổ biến được sử dụng để quản lý và lưu trữ dữ liệu bất đồng bộ trong các ứng dụng React. Thư viện cung cấp một cách đơn giản và hiệu quả để lấy dữ liệu, lưu trữ dữ liệu vào bộ nhớ cache và cập nhật dữ liệu trong các thành phần. Điều này giúp dễ dàng xử lý logic liên quan đến dữ liệu mà không cần phải sử dụng các giải pháp phức tạp quản lý trạng thái.

Xem thêm...