Gia Bao TSC

Abstract Factory Design Pattern

Trong bài viết trước, chúng ta đã cùng nhau tìm hiểu thế nào là Design Pattern và tại sao phải học nó. Để minh chứng rõ hơn, hôm nay chúng ta sẽ cùng tìm hiểu về Abstract Factory Design Pattern để hiểu thêm về lợi ích của Design Pattern trong phát triển phần mềm.

 Design Patterns  posted at February 22, 2019

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

Source Code

Gia Bao TSC