Abstract Factory trong Java

- Published on
- /4 mins read/
Abstract Factory là một trong các mẫu thiết kế thuộc nhóm Creational Design Pattern. Mục tiêu chính của nó là cung cấp một interface để tạo ra các họ đối tượng liên quan hoặc phụ thuộc mà không cần chỉ rõ lớp cụ thể của chúng.
Tại sao cần Abstract Factory?:
Khi bạn làm việc với hệ thống có các nhóm đối tượng liên quan (như các sản phẩm trong UI: Button, Checkbox, Dropdown) và muốn quản lý chúng nhất quán, Abstract Factory giúp đảm bảo rằng tất cả các đối tượng trong một nhóm sẽ phù hợp với nhau.
Khác biệt với Factory Method Pattern:
Nếu Factory Method tạo một đối tượng cụ thể thì Abstract Factory tập trung vào việc tạo một nhóm đối tượng.
1. Ưu điểm
- Tách biệt mã nguồn và đối tượng cụ thể: Giảm sự phụ thuộc vào các lớp cụ thể, giúp mã dễ bảo trì và mở rộng.
- Tăng tính linh hoạt: Dễ dàng thay đổi hoặc bổ sung các họ sản phẩm mới mà không ảnh hưởng đến mã hiện có.
- Tính nhất quán: Đảm bảo các đối tượng trong cùng một nhóm luôn tương thích.
2. Nhược điểm
- Độ phức tạp cao hơn: Thiết kế phức tạp hơn khi chỉ cần tạo một số lượng ít đối tượng.
- Khó khăn trong việc mở rộng: Thêm sản phẩm mới vào một họ sản phẩm có thể yêu cầu thay đổi trong các factory hiện tại.
3. Khi nào nên dùng Abstract Pattern
- Khi hệ thống của bạn cần tạo các nhóm đối tượng liên quan, như UI themes (Light và Dark theme).
- Khi bạn muốn tách biệt logic tạo đối tượng ra khỏi logic kinh doanh, giúp dễ dàng mở rộng và bảo trì.
- Trong các ứng dụng đa nền tảng, nơi các đối tượng được tạo khác nhau tùy theo nền tảng (Windows, MacOS, Linux).
4. Ví dụ
Xây dựng một ứng dụng cần hỗ trợ cả hai giao diện Light và Dark. Mỗi giao diện có các thành phần UI riêng như Button và Checkbox.
Cài đặt Abstract Factory Pattern trong Java:
- Định nghĩa các Interfaces:
// Button Interface
public interface Button {
void render();
}
// Checkbox Interface
public interface Checkbox {
void render();
}- Triển khai cho Light Theme:
// Light Button Implementation
public class LightButton implements Button {
@Override
public void render() {
System.out.println("Rendering Light Button");
}
}
// Light Checkbox Implementation
public class LightCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Rendering Light Checkbox");
}
}- Triển khai cho Dark Theme:
// Dark Button Implementation
public class DarkButton implements Button {
@Override
public void render() {
System.out.println("Rendering Dark Button");
}
}
// Dark Checkbox Implementation
public class DarkCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Rendering Dark Checkbox");
}
}- Định nghĩa Abstract Factory:
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
}- Triển khai các Factory cụ thể:
// Factory for Light Theme
public class LightUIFactory implements UIFactory {
@Override
public Button createButton() {
return new LightButton();
}
@Override
public Checkbox createCheckbox() {
return new LightCheckbox();
}
}
// Factory for Dark Theme
public class DarkUIFactory implements UIFactory {
@Override
public Button createButton() {
return new DarkButton();
}
@Override
public Checkbox createCheckbox() {
return new DarkCheckbox();
}
}- Sử dụng Abstract Factory:
public class Application {
private final Button button;
private final Checkbox checkbox;
public Application(UIFactory factory) {
this.button = factory.createButton();
this.checkbox = factory.createCheckbox();
}
public void renderUI() {
button.render();
checkbox.render();
}
public static void main(String[] args) {
UIFactory lightFactory = new LightUIFactory();
Application lightApp = new Application(lightFactory);
lightApp.renderUI();
UIFactory darkFactory = new DarkUIFactory();
Application darkApp = new Application(darkFactory);
darkApp.renderUI();
}
}- Kết quả khi chạy chương trình:
Rendering Light Button
Rendering Light Checkbox
Rendering Dark Button
Rendering Dark CheckboxLời kết
Abstract Factory Pattern là một giải pháp mạnh mẽ để tạo các họ đối tượng liên quan mà không cần chỉ rõ lớp cụ thể của chúng. Mặc dù có một số nhược điểm về mặt phức tạp, nhưng pattern này vẫn rất hữu ích trong các ứng dụng lớn hoặc yêu cầu mở rộng linh hoạt.
Bạn có thể áp dụng Abstract Factory trong các dự án Java để đảm bảo mã nguồn rõ ràng, dễ bảo trì và dễ mở rộng.
Bài viết mang tính chất "ghi chú - chia sẻ và phi lợi nhuận".
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding 😎 👍🏻 🚀 🔥.