CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Tìm hiểu Builder Design Pattern với ví dụ sử dụng ngôn ngữ C#

Đăng lúc: 11:44 AM - 09/11/2022 bởi Charles Chung - 588

Builder Pattern là một trong những design pattern thuộc nhóm Creational pattern. Nó đượ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 cách tiếp cận từng bước để xây dựng các đối tượng độc lập với các đối tượng khác.

1. Các thành phần trong Builder Pattern

  • Builder là abstract class hoặc interface khai báo phương thức tạo đối tượng.
  • ConcreteBuilder tạo và ghép nối các phần của 1 product bằng cách implement Builder interface định nghĩa lại và ghi lại những chi tiết mà nó tạo ra, đưa ra 1 interface để có thể trả về chi tiết product tạo ra.
  • Director tạo ra object sử dụng Builder interface.
  • Product chính là object phức tạp, gồm nhiều thành phần. ConcreteBuilder sẽ xây dựng chi tiết sản phẩm bên trong và định nghĩa việc xử lý ghép nối, gồm các class định nghĩa các chi tiết, và các interface để ghép nối các phần tạo ra kết quả cuối cùng.

2. Ví dụ thực tế

Một shop cần sản xuất các sản phẩm về xe cộ bao gồm 3 loại MotorCycle, Car, Scooter. Mỗi loại gồm 4 thành phần là Frame, Engine, Wheels, Doors. Vậy áp dụng Builder Pattern thì các thành phần sẽ như sau:

  • Product (Vehicle)
  • ConcreteBuilder (MotorCycleBuilder, CarBuilder, ScooterBuilder)
  • Director (Shop)
  • Builder (VehicleBuilder)

3. Demo Code C#

Tệp Vehicle.cs

namespace Example02
{
    /// <summary>
    /// Lớp Vehicle đóng vai trò là Product
    /// </summary>
    class Vehicle
    {
        //loại xe
        private string _vehicleType;
        //khai báo dictionary chứa các thành phần của 1 chiếc xe
        private Dictionary<string, string> _parts = new Dictionary<string, string>();
        // Hàm khởi tạo
        public Vehicle(string vehicleType)
        {
            this._vehicleType = vehicleType;
        }
        // Chỉ mục
        public string this[string key]
        {
            get { return _parts[key]; }
            set { _parts[key] = value; }
        }
        //hàm hiển thị thông tin xe
        public void Show()
        {
            Console.WriteLine("\n---------------------------");
            Console.WriteLine("Vehicle Type: {0}", _vehicleType);
            Console.WriteLine(" Frame : {0}", _parts["frame"]);
            Console.WriteLine(" Engine : {0}", _parts["engine"]);
            Console.WriteLine(" #Wheels: {0}", _parts["wheels"]);
            Console.WriteLine(" #Doors : {0}", _parts["doors"]);
        }
    }
}

Tệp VehicleBuilder.cs

namespace Example02
{
    /// <summary>
    /// Lớp abstract VehicleBuilder đóng vai trò là 'Builder'
    /// </summary>
    abstract class VehicleBuilder
    {
        //khai báo trường kiểu Vehicle
        protected Vehicle vehicle;
        // định nghĩa thuộc tính get cho vehicle
        public Vehicle Vehicle
        {
            get { return vehicle; }
        }
        // khai báo các phương thức abstract để build
        public abstract void BuildFrame();
        public abstract void BuildEngine();
        public abstract void BuildWheels();
        public abstract void BuildDoors();
    }
}

Tệp MotorCycleBuilder.cs

namespace Example02
{
    /// <summary>
    /// Lớp MotorCycleBuilder đóng vai trò là 'ConcreteBuilder1'
    /// </summary>
    class MotorCycleBuilder : VehicleBuilder
    {
        public MotorCycleBuilder()
        {
            vehicle = new Vehicle("MotorCycle");
        }
        public override void BuildFrame()
        {
            vehicle["frame"] = "MotorCycle Frame";
        }
        public override void BuildEngine()
        {
            vehicle["engine"] = "500 cc";
        }
        public override void BuildWheels()
        {
            vehicle["wheels"] = "2";
        }
        public override void BuildDoors()
        {
            vehicle["doors"] = "0";
        }
    }
}

Tệp CarBuilder.cs
namespace Example02
{
    /// <summary>
    /// Lớp CarBuilder đóng vai trò là 'ConcreteBuilder2' 
    /// </summary>
    class CarBuilder : VehicleBuilder
    {
        public CarBuilder()
        {
            vehicle = new Vehicle("Car");
        }
        public override void BuildFrame()
        {
            vehicle["frame"] = "Car Frame";
        }
        public override void BuildEngine()
        {
            vehicle["engine"] = "2500 cc";
        }
        public override void BuildWheels()
        {
            vehicle["wheels"] = "4";
        }
        public override void BuildDoors()
        {
            vehicle["doors"] = "4";
        }
    }
}

Tệp ScooterBuilder.cs

namespace Example02
{
    /// <summary>
    /// Lớp ScooterBuilder đóng vai trò là ConcreteBuilder3
    /// </summary>
    class ScooterBuilder : VehicleBuilder
    {
        public ScooterBuilder()
        {
            vehicle = new Vehicle("Scooter");
        }
        public override void BuildFrame()
        {
            vehicle["frame"] = "Scooter Frame";
        }
        public override void BuildEngine()
        {
            vehicle["engine"] = "50 cc";
        }
        public override void BuildWheels()
        {
            vehicle["wheels"] = "2";
        }
        public override void BuildDoors()
        {
            vehicle["doors"] = "0";
        }
    }
}

Tệp Shop.cs

namespace Example02
{
    /// <summary>
    /// Lớp Shop đóng vai trò là Director 
    /// </summary>
    class Shop
    {
        // phương thức tạo 1 chiêc xe từ nhiều thành phần
        public void Construct(VehicleBuilder vehicleBuilder)
        {
            vehicleBuilder.BuildFrame();
            vehicleBuilder.BuildEngine();
            vehicleBuilder.BuildWheels();
            vehicleBuilder.BuildDoors();
        }
    }
}

Tệp Program.cs

namespace Example02
{
    class Program
    {
        static void Main(string[] args)
        {
            // Khai báo đối tượng builder
            VehicleBuilder builder;
            // Tạo đối tượng shop
            Shop shop = new Shop();

            // Tạo đối tượng Scooter
            builder = new ScooterBuilder();
            // Gọi phương thức tạo các thành phần của Scooter
            shop.Construct(builder);
            // Hiển thị thông tin xe
            builder.Vehicle.Show();

            // Tạo đối tượng Car
            builder = new CarBuilder();
            // Gọi phương thức tạo các thành phần của Car
            shop.Construct(builder);
            // Hiển thị thông tin xe
            builder.Vehicle.Show();

            // Tạo đối tượng MotorCycle
            builder = new MotorCycleBuilder();
            // Gọi phương thức tạo các thành phần của MotorCycle
            shop.Construct(builder);
            // Hiển thị thông tin xe
            builder.Vehicle.Show();

            // dừng màn hình chờ nhấn phím bất kỳ
            Console.ReadKey();
        }
    }
}

 

Link tải source code (Google Drive)

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ