Mẫu thiết kế (3) - Mẫu nhà máy

Bài viết trước: Mẫu đơn thể

1. Mẫu nhà máy là gì?

Mẫu nhà máy (Factory Pattern) là giải pháp thiết kế giúp tách biệt quá trình khởi tạo đối tượng khỏi logic sử dụng. Thay vì trực tiếp dùng từ khóa new, chúng ta sử dụng một "nhà máy" trung gian để tạo ra các thể hiện thông qua giao diện chung. Ví dụ thực tế: Khi mua điện thoại, bạn chỉ cần nhận sản phẩm hoàn chỉnh mà không cần quan tâm đến quy trình sản xuất phức tạp bên trong.

2. Khi nào nên áp dụng?

Mẫu này phù hợp khi:
  • Cần tạo các đối tượng phức tạp với nhiều bước khởi tạo
  • Ứng dụng yêu cầu mở rộng hệ thống dễ dàng trong tương lai
  • Giảm sự phụ thuộc giữa lớp người dùng và lớp cụ thể

3. Phân loại mẫu nhà máy

3.1 Nhà máy đơn giản

Phù hợp cho hệ thống với số lượng đối tượng giới hạn thuộc cùng một cấp bậc. Ví dụ minh họa:

// Giao diện sản phẩm public interface Product { void show(); } // Sản phẩm A public class ProductA implements Product { public void show() { System.out.println("Sản phẩm A"); } } // Sản phẩm B public class ProductB implements Product { public void show() { System.out.println("Sản phẩm B"); } } // Nhà máy đơn giản public class SimpleFactory { public static Product createProduct(String type) { switch(type) { case "A": return new ProductA(); case "B": return new ProductB(); default: return null; } } } // Cách sử dụng Product item = SimpleFactory.createProduct("A"); item.show();

Giới hạn: Thêm sản phẩm mới buộc phải sửa đổi logic nhà máy.

3.2 Phương thức nhà máy

Thiết kế mở rộng dựa trên nguyên tắc mở/đóng (Open-Closed Principle). Cách triển khai:

// Giao diện nhà máy public interface Factory { Product createProduct(); } // Nhà máy sản phẩm A public class ProductAFactory implements Factory { public Product createProduct() { return new ProductA(); } } // Nhà máy sản phẩm B public class ProductBFactory implements Factory { public Product createProduct() { return new ProductB(); } } // Cách sử dụng Factory factory = new ProductAFactory(); Product item = factory.createProduct(); item.show();

Ưu điểm: Thêm sản phẩm mới chỉ cần tạo nhà máy mới, không sửa code cũ.

Nhược điểm: Tạo nhiều lớp nhà máy khi có nhiều loại sản phẩm.

3.3 Nhà máy trừu tượng

Giải pháp cho hệ thống có nhiều nhóm sản phẩm liên quan. Ví dụ:

// Giao diện nhóm sản phẩm 1 public interface Category1 { void info(); } // Giao diện nhóm sản phẩm 2 public interface Category2 { void details(); } // Nhà máy trừu tượng public interface AbstractFactory { Category1 createCategory1(); Category2 createCategory2(); } // Triển khai cụ thể public class ConcreteFactory implements AbstractFactory { public Category1 createCategory1() { return new ProductX(); } public Category2 createCategory2() { return new ProductY(); } }

Phù hợp khi cần tạo nhiều nhóm đối tượng có mối liên hệ phức tạp.

Bài viết tiếp theo: Mẫu nhà máy trừu tượng

Thẻ: Java design-patterns factory-pattern object-oriented-design

Đăng vào ngày 4 tháng 6 lúc 05:43