Factory Method Pattern

Anh PhanAnh Phan
2 min read

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

  1. Định nghĩa một method (nằm trong interface hoặc class đều được) mang vai trò khởi tạo object

  2. Đị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

  1. Khi client code trực tiếp sử dụng new ProductA(), sẽ xảy ra dependency từ client code đến ProductA. Nếu chúng ta sau này cần tạo ProductB , 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.

  2. Đặt tên method mang ý nghĩa, expressive hơn nếu dùng constructor thông thường

  3. 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.

0
Subscribe to my newsletter

Read articles from Anh Phan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Anh Phan
Anh Phan