Search…

Design Pattern: Abstract Factory Pattern

26/09/20203 min read
Được phát triển dựa trên kiến thức đa hình trong phương pháp lập trình hướng đối tượng. Abstract Factory là 1 trong những Design Pattern thông dụng, làm các đoạn mã trở nên mềm giẻo và dễ bảo trì.

Design Pattern

Design Pattern là 1 khái niệm để nói về các phương pháp giải quyết vấn đề trong lập trình, với mục đích giải quyết nhanh gọn, và lưu trữ cho thế hệ về sau có thể xử lý nhanh vấn đề. 

Abstract Factory Design Pattern

Abstract Factory là sự mở rộng của tính chất đa hình trong lập trình hướng đối tượng. Mục tiêu hướng đến là có thể tạo ra các đối tượng mà chưa biết trước chính xác kiểu dữ liệu của chúng.

Abstract factory là 1 nhà máy lớn chứa nhiều nhà máy nhỏ, trong các nhà máy đó có những xưởng sản xuất, các xưởng đó tạo ra những sản phẩm khác nhau. 

Mục tiêu

- Tạo ra đối tượng mà không cần biết chính xác kiểu dữ liệu.

  • Ví dụ: khi đọc dữ liệu từ 1 file txt để lấy thông tin tạo đối tượng. Trong file txt đó chứa 1 số nguyên. Trong mã nguồn, nếu dữ liệu đọc được là số 1 thì tạo ra đối tượng A, nếu là 2 thì tạo ra đối tượng B. Vậy rõ ràng, đối tượng chỉ được tạo ra trong quá trình run time, nghĩa là trong lúc viết mã nguồn chương trình, chưa xác định được đối tượng mình cần tạo. Abstract Factory có thể giúp giải quyết vấn đề này.

- Giúp mã nguồn trở nên dễ dàng bảo trì nếu có sự thay đổi.

Abstract Factory được hình dung như là 1 nhà máy chứa nhiều nhà máy con. Mỗi nhà máy con là 1 factory.

Sử dụng Abstract Factory để tạo ra tất cả các đối tượng trong chương trình. Khi sửa đổi hoặc thêm mới 1 đối tượng, các đối tượng khác sẽ không bị ảnh hưởng.

Mô tả tư tưởng

Mô hình Abstract Factory

Sử dụng Abstract Factory để tạo ra tất cả các đối tượng trong chương trình.

Hiện thực hóa

Tạo 1 hệ thống các lớp đối tượng như trên.

Tạo ra lớp Grass, Tree, Flower, những lớp này kế thừa từ lớp thuần ảo Plant.

Tương tự điều đó với RabitRat

Sau đó, hiện thực Plant Factory như sau:

Plant* getPlant(int ID)
{
	switch (ID)
	{
	case PLT_GRASS:
		return new Grass();
	case PLT_TREE:
		return new Tree();
	case PLT_FLOWER:
		return new Flower();
	default:
		break;
	}
}

 Animal Factory

Animal* getAnimal(int ID)
{
	switch (ID)
	{
	case ANL_RABIT:
		return new Rabit();
	case ANL_RAT:
		return new Rat();
	default:
		break;
	}
}

Hiện thực AbstracFactory

class AbstracFactory
{
public:

	Plant* createPlant(int ID)
	{
		return getPlant(ID);
	}

	Animal* createAnimal(int ID)
	{
		return getAnimal(ID);
	}
};

Ví dụ để gọi factory trong hàm main().

int main()
{
	AbstracFactory* factory = new AbstracFactory();

	Plant* obj1 = factory->createPlant(PLANT::PLT_GRASS);
	Animal* obj2 = factory->createAnimal(ANIMAL::ANL_RABIT);

	return 0;
}
  • Trong code mẫu, thay vì hiện thực các factory con là lớp, hiện thực thành các hàm, bởi chúng có thể thực hiện cùng 1 mục đích, nhưng hàm thì không cần thông qua thể hiện, hay tạo lớp static.
  • Với những ngôn ngữ khác như Java, việc đa kế thừa là không thể, nên có thể thay đổi các lớp factory thành các hàm như trên hoặc thành các interface.
  • Có thể kết hợp Singleton Design Pattern cùng với Abstract Factory để làm cho Abstract Factory có thể gọi được ở mọi nơi trong chương trình. Điều này sẽ linh động trong việc tạo ra các instance. Tuy nhiên cần cân nhắc bởi sẽ tiêu tốn nhiều tài nguyên để gọi hàm.

Tham khảo demo tại đây.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024