9 mẫu thiết kế mà mỗi lập trình viên dều phải biết - phần 1: Builder pattern

Nội dung bài viết

Video học lập trình mỗi ngày

Builder pattern là một mẫu thiết kế thuộc "Nhóm khởi tạo" (Creational Pattern). Và là một mẫu thiết kế để cung cấp một giải pháp linh hoạt để tạo các đối tượng. Cụ thể hơn là Builder pattern giúp chúng ta 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 bằng cách cung cấp cách tiếp cận từng đối tượng đơn giản. Cùng xem một hướng dẫn dưới đây.

Update Phần 2: Factory pattern là gì? Tại sao mô hình VINFAST lại sử dụng?


Builder pattern là gì


Builder Pattern phân tách một đối tượng phức tạp thành nhiều phần tương đối đơn giản, sau đó tạo chúng riêng biệt theo các nhu cầu khác nhau, và cuối cùng là xây dựng đối tượng phức tạp. 


Nếu bạn không hiểu phần giới thiệu về Builder pattern là gì? Ở phía trên thì không sao cả, đừng lo lắng. Thực tế mà nói, các mẫu thiết kế được các developers sử dựng hằng ngày, nhưng có thể bạn chưa nhận ra đó mà thôi. Việc kết hợp những ví dụ dưới đây sé giúp bạn hiểu và định hình sâu hơn về những thiết kế mà mình đang sử dụng. Và một trong 9 thiết kế mà mỗi lập trình viên cần phải biết đó là Builder pattern. Dưới đây, tôi đã chuẩn bị ba ví dụ để bạn biết tình huống nào sẽ sử dụng thiết kế này. Ok, let's go.


Xây dựng một chiếc ô tô sử dụng Builder Pattern

Như ai cũng biết rằng để xây dụng một chiếc ô tô thường bao gồm nhiều bộ phận khác nhau, và ở đây tôi lấy 3 bộ phận để làm ví dụ đó là một động cơ, hai là khung, ba là thân xe tóm lại là chúng ta đang nói đến 3 bộ phận. Thực tế là như vậy, việc tách rời những bộ phận của chiếc xe ô tô để chế tạo thì có lẽ sẽ đơn giản hơn là sản xuất nguyên một chiếc ô tô. Đó chính là mô hình Builder Pattern mà tôi đang cố giải thích cho bạn. Nếu bạn chưa hiểu chúng ta sẽ đi xem ví dụ thứ 2, code ví dụ sẽ ở cuối bài viết.

Xây dựng các khối lego sử dụng Builder Pattern


Mô hình lego thì quá quen thuộc rồi, tôi và con tôi chơi suốt. Nhưng nhiều khi bạn có để ý là mỗi lần mua hộp lego về thì sẽ có tờ hướng dẫn kèm theo. Các khối Lego là một cảnh lắp ghép ngẫu nhiên điển hình. Bạn có rất nhiều khối Lego. Để xây một ngôi nhà nhỏ thì quá phức tạp. Bạn có thể phải làm theo hướng dẫn từng bước. Điều này giống như tạo một đối tượng phức tạp với rất nhiều đầu vào. 

Các thông số và thứ tự không được sai. Nhưng con tôi thì nó chỉ muốn lắp theo sở thích của nó, không theo một nguyên tắc nào. Và nó chỉ muốn nhanh chóng có được một ngôi nhà tiêu chuẩn, sao cho nhanh nhất và tiện lợi nhất? Chính vì thế Builder Pattern giúp chúng ta chỉ build những gì thực sự cần thiết mà thôi. Chúng ta qua ví dụ tiếp theo trước khi đi vào một đoạn code cụ thể.


Xây dựng một dàn máy PC sử dụng Builder Pattern


Ở ví dụ 2 là nói đến Con tôi, giờ đến lượt tôi. Thật sự muốn build một dàn máy PC thì ai cũng như nhau. Nhưng chỉ khác một điều là cách mua thế nào. Ở đây có hai cách, đó là một ra PHONG VŨ mua một con được lắp sẵn tại cửa hàng. Hai là tự mình ra mua những linh kiện máy tính cần thiết để phục vụ cho mình, cụ thể là tôi muốn mua linh kiện cho mục đích đáng DOTA2 của tôi. 

Vì vậy tôi chia những linh kiện (đối tượng đơn giản) và gộp lại thành một chiếc máy tính mà tôi muốn (xây dựng đối tượng phức tạp). Thông qua 3 ví dụ cụ thể tôi cũng nghĩ là bạn đã hiểu được phần nào của việc sử dụng Builder Pattern. Và tiếp theo, tôi sẽ xây dựng một đoạn code về ví dụ thứ nhất. Còn 2 và 3 thì các bạn nên tự tìm hiểu và code nhé.


Code Triển khai Builder Pattern xây dựng một chiếc ô tô

//Một chiếc xe gồm có 3 bộ phận
"use strict";
class Car {
    constructor(engine, chassis, body) {
        this.engine = engine;
        this.chassis = chassis;
        this.body = body;
    }
    
		toString(){
    	return JSON.stringify(this)
    }
}

Xây dựng từng bộ phận của xe

class CarBuilder {
    addChassis(chassis) {
        this.chassis = chassis;
        return this;
    }
    addEngine(engine) {
        this.engine = engine;
        return this;
    }
    addBody(body) {
        this.body = body;
        return this;
    }
    build() {
        return new Car(this.engine, this.chassis, this.body);
    }
}

Build thôi

const car = new CarBuilder()
    .addEngine('v12')
    .addBody('KIA SOLUTO')
    .addChassis('LUXURY')
    .build();

const car1 = new CarBuilder().addEngine('v10')
    .addBody('KIA SOLUTO LUXURY').build();

    
console.log('kakaka Car', car.toString())
console.log('kakaka Car1', car1.toString())

Béo lại

Update Phần 2: Factory pattern là gì? Tại sao mô hình VINFAST lại sử dụng?

Như vậy trong hướng dẫn này, chúng tôi đã trình bày một mẫu Builder trong JavaScript. Nhằm mục đích giúp bạn nắm rõ về Builder Pattern, đây là một trong 9 mẫu thiết kế mà mỗi developers phải nắm sâu và rõ nhất. Ở phần sau chúng ta sẽ nói về factory pattern đó là một mô hình phức tạp được chia nhỏ thành 3 phần: 

  • Simple factory 
  • Factory method 
  • Abstract factory 

Mời các bạn đón đọc. Xin chào và hẹn gặp lại!

Có thể bạn đã bị missing