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 - 588Builder 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!
Các bài cũ hơn
- Truy xuất dữ liệu trong ASP.NET Core 2.1 sử dụng Entity Framework Core(Code First) (05:12 PM - 08/11/2022)
- Tìm hiểu Abstract Factory Design Pattern với ví dụ sử dụng ngôn ngữ C# (08:50 AM - 08/11/2022)
- Authorization và Authentication sử dụng Cookie trong ASP.NET Core (10:50 AM - 07/11/2022)
- Tìm hiểu Factory Design Pattern với ví dụ sử dụng ngôn ngữ C# (01:47 PM - 04/11/2022)
- Giới thiệu các phiên bản Visual Studio Community 2017-2019-2022 (03:24 PM - 03/11/2022)