Search…

Design Pattern: Builder Pattern

25/09/20202 min read
Bài viết cung cấp các kiến thức cơ bản về Builder Pattern và cách thức hoạt động của nó.

Builder Pattern

Đặt vấn đề

Trong những phần mềm lớn, với những chức năng phức tạp và nhiều đối tượng, việc khởi tạo ứng dụng gặp nhiều khó khăn. Không thể dồn tất cả công việc khởi tạo này cho một hàm khởi tạo. Vì như thế sẽ rất khó kiểm soát hết, và hơn nữa không phải lúc nào các thành phần của ứng dụng cũng được khởi tạo một cách đồng bộ. Có thành phần được tạo ra vào lúc dịch chương trình nhưng cũng có thành phần tuỳ theo từng yêu cầu của người dùng, tuỳ vào hoàn cảnh của ứng dụng, mà nó sẽ được tạo ra. Do vậy giao công việc này cho một đối tượng chịu trách nhiệm khởi tạo, và chia việc khởi tạo ứng dụng riêng rẽ, để có thể tiến hành khởi tạo riêng biệt ở các hoàn cảnh khác nhau. Giải pháp đưa ra là sử dụng Builder Pattern như một người xây dựng.

Builder Pattern là gì?

Builder pattern là loại design pattern thuộc loại Creational Pattern, mô hình này cung cấp một trong những cách tốt nhất để tạo ra một đối tượng. Builder Pattern là mẫu thiết kế đối tượng được tạo ra để xây dựng một đôi tượng phức tạp bằng cách sử dụng các đối tượng đơn giản và sử dụng tiếp cận từng bước, việc xây dựng các đối tượng đôc lập với các đối tương khác.

Sơ đồ UML

Builder Pattern
  • Builder: là thành phần định nghĩa lớp trừu tượng (abstract class) để tạo ra một hoặc nhiều thành phần của đối tượng Product.
  • ConcreteBuilder: là thành phần triển khai, cụ thể hoá các lớp trừu tượng để tạo ra các thành phần và tập hợp các thành phần đó với nhau, xác định và nắm giữ các thành phần mà nó tạo ra.
  • Product: thành phần này đại diện cho đối tượng phức tạp được tạo ra.
  • Director: thông báo với Builder khi nào một thành phần cần được tạo ra.

Ví dụ cụ thể

Mô tả ý tưởng

AnimalBuilder

Hiện thực hoá

Hiện thực Animal 

class Animal
{
public:
	Body*   body[4];
	Facade*  facade;
	Food* food;

	void specifications()
	{
		cout << "Animal with" << "body ," << body[0]->weight << "facade" << facade->color << "food " << food->plant << endl;
	}
};

Hiện thực Builder

class Builder
{
public:
	virtual Body* getBody() = 0;
	virtual Facade* getFacade() = 0;
	virtual Food* getFood() = 0;
};

Hiện thực Director

class Director
{
	Builder* builder;

public:
	void setBuilder(Builder* newBuilder)
	{
		builder = newBuilder;
	}

	Animal* getAnimal()
	{
		Animal* animal = new Animal();

		animal->facade = builder->getFacade();

		animal->food = builder->getFood();

		animal->body[0] = builder->getBody();
		animal->body[1] = builder->getBody();
		animal->body[2] = builder->getBody();
		animal->body[3] = builder->getBody();

		return animal;
	}
};

Download Demo

STDIO_BuilderPattern.zip

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