Mẫu Thiết Kế Nhà Máy: Cách Tạo Đối Tượng Linh Hoạt trong Lập Trình Hướng Đối Tượng

Giới thiệu về mẫu thiết kế Factory

Mẫu thiết kế Factory (hay còn gọi là Mẫu Nhà Máy) là một trong những mẫu thiết kế tạo lập (Creational Pattern) phổ biến nhất trong phát triển phần mềm hướng đối tượng. Thay vì để người dùng trực tiếp khởi tạo đối tượng bằng từ khóa new, Factory giúp đóng gói quá trình khởi tạo vào bên trong một lớp riêng biệt, qua đó tách biệt logic tạo đối tượng khỏi mã nguồn gọi sử dụng.

Với cách tiếp cận này, người tiêu dùng chỉ cần biết tên hoặc loại của đối tượng mong muốn mà không cần quan tâm đến cách thức nó được xây dựng ra sao — điều này tăng tính mở rộng và giảm sự phụ thuộc giữa các thành phần trong hệ thống.

Các thành phần chính trong mẫu Factory

  • Giao diện sản phẩm (Product Interface): Định nghĩa hành vi chung cho tất cả các đối tượng có thể được tạo ra.
  • Các lớp cụ thể (Concrete Classes): Triển khai giao diện sản phẩm với hành vi đặc thù.
  • Lớp nhà máy (Factory Class): Chịu trách nhiệm quyết định nên khởi tạo đối tượng nào dựa trên tham số đầu vào.

Triển khai minh họa bằng Java

Giả sử ta đang xây dựng một hệ thống mô phỏng các hoạt động hàng ngày như ăn, uống, ngủ. Mỗi hoạt động là một "sản phẩm" có thể được cung cấp bởi một nhà máy.

Bước 1: Xác định giao diện chung

public interface Activity {
    void perform();
}

Bước 2: Các lớp cụ thể triển khai hành vi

public class Eating implements Activity {
    @Override
    public void perform() {
        System.out.println("Đang ăn bữa trưa");
    }
}
public class Drinking implements Activity {
    @Override
    public void perform() {
        System.out.println("Uống nước lọc");
    }
}
public class Sleeping implements Activity {
    @Override
    public void perform() {
        System.out.println("Ngủ trưa 30 phút");
    }
}

Bước 3: Xây dựng lớp nhà máy

public class ActivityFactory {
    public Activity createActivity(String type) {
        if (type == null || type.isEmpty()) {
            return null;
        }

        switch (type.toLowerCase()) {
            case "eat":
                return new Eating();
            case "drink":
                return new Drinking();
            case "sleep":
                return new Sleeping();
            default:
                return null;
        }
    }
}

Bước 4: Sử dụng nhà máy để tạo và thực thi đối tượng

public class Application {
    public static void main(String[] args) {
        ActivityFactory factory = new ActivityFactory();

        Activity meal = factory.createActivity("eat");
        if (meal != null) meal.perform();

        Activity water = factory.createActivity("drink");
        if (water != null) water.perform();

        Activity nap = factory.createActivity("sleep");
        if (nap != null) nap.perform();
    }
}

Kết quả đầu ra:

Đang ăn bữa trưa
Uống nước lọc
Ngủ trưa 30 phút

Ưu điểm của mẫu Factory

  • Tính đóng gói: Mã khởi tạo đối tượng được ẩn bên trong nhà máy, người dùng không cần biết chi tiết nội bộ.
  • Dễ mở rộng: Khi cần thêm hoạt động mới (ví dụ: tập thể dục), chỉ cần tạo lớp mới và cập nhật factory — không làm ảnh hưởng đến các lớp khác.
  • Giảm sự phụ thuộc: Mã gọi chỉ phụ thuộc vào giao diện Activity, không lệ thuộc vào từng lớp cụ thể.

Nhược điểm cần cân nhắc

Mỗi khi thêm một loại đối tượng mới, bắt buộc phải sửa đổi lớp factory (trừ khi áp dụng Factory Method hoặc Abstract Factory). Điều này vi phạm nguyên lý Open/Closed nếu không được xử lý cẩn thận. Ngoài ra, số lượng lớp tăng lên có thể khiến cấu trúc dự án trở nên phức tạp hơn với các trường hợp đơn giản.

Ví dụ: Nếu toàn bộ ứng dụng chỉ cần một vài đối tượng nhỏ, việc dùng factory có thể là "dùng dao mổ trâu để giết gà" — làm tăng độ phức tạp không cần thiết.

Khi nào nên sử dụng?

  • Khi hệ thống cần hỗ trợ nhiều loại đối tượng tương tự nhau nhưng có hành vi khác biệt.
  • Khi việc lựa chọn loại đối tượng phụ thuộc vào cấu hình, người dùng, hoặc môi trường (như cơ sở dữ liệu, giao thức mạng).
  • Khi muốn trì hoãn việc quyết định loại đối tượng đến thời điểm chạy chương trình (runtime).

Thẻ: factory-pattern design-patterns Java oop creational-patterns

Đăng vào ngày 13 tháng 6 lúc 02:25