Abstract Factory Design Pattern
Đây là một pattern kinh điển trong loạt Create Pattern.
Factory? Trong tiếng Việt có nghĩa là nhà máy, pattern này được sử dụng khi hệ thống của bạn có nhiều đối tượng với thuộc tính, hành vi tương tự nhau. Pattern Factory giống như một nhà máy sản sinh các đối tượng tương tự nhau này cho bạn.
**Khi nào sử dụng và Lợi ích của Abstract Factory **
- Taọ các đối tượng tương tự nhau
- Cung cấp phương thức hoàn chỉnh (có thể tổng hợp thành library) để sinh các đối tượng
- Tạo các đối tượng đặc biệt từ các lớp cha
- Dễ dàng tạo extends system từ system cũ
Ví dụ
Thiết kế cho Bank là ví dụ kinh điển áp dụng Abstract Factory.

Bank.java
public interface Bank {
String getBankName();
}
VietcomBank.java
public class VietcomBank implements Bank {
@Override
public String getBankName() {
return "VietcomBank";
}
}
TechcomBank.java
public class VietcomBank implements Bank {
@Override
public String getBankName() {
return "TechcomBank";
}
}
AgriBank.java
public class VietcomBank implements Bank {
@Override
public String getBankName() {
return "AgriBank";
}
}
BIDV.java
public class VietcomBank implements Bank {
@Override
public String getBankName() {
return "BIDV";
}
}
Tạo danh sách kiểu Bank: BankType.java
public enum BankType {
VIETCOMBANK,
TECHCOMBANK,
AGRIBANK,
BIDV,
UNKNOWN;
}
Tạo một lớp Factory để sinh các object: BankFactory.java
public class BankFactory {
private BankFactory() {}
public static final Bank getBank(BankType bankType) {
switch (bankType) {
case VIETCOMBANK:
return new VietcomBank();
case TECHCOMBANK:
return new TechcomBank();
case AGRIBANK:
return new AgriBank();
case BIDV:
return new BIDV();
default:
throw new IllegalArgumentException("This bank type is unsupported");
}
}
}
Đến đây bạn có thể tạo test đơn giản với Factory trên để kiểm nghiệm vai trò của Factory Design Pattern rồi
BankApplication.java
public class BankApplication {
private static Scanner sc;
public static void main(String[] args) {
System.out.print("Please input short name of bank: ");
sc = new Scanner(System.in);
String inputStr = sc.nextLine();
// convert to integer
BankType bankType = BankType.UNKNOWN;
if (inputStr.toLowerCase().equals("tcb")) {
bankType = BankType.TECHCOMBANK;
} else if (inputStr.toLowerCase().equals("vcb")) {
bankType = BankType.VIETCOMBANK;
} else if (inputStr.toLowerCase().equals("agb")) {
bankType = BankType.AGRIBANK;
} else if (inputStr.toLowerCase().equals("bidv")) {
bankType = BankType.BIDV;
}
// create bank
Bank bank = BankFactory.getBank(bankType);
System.out.println(bank.getBankName());
}
}
Tham khảo
-
Design Pattern Elements of Reusable Object-Oriented Software
-
https://www.binpress.com/tutorial/the-factory-design-pattern-explained-by-example/142


Design Patterns

