مشخصات مقاله
-
1650
-
0.0
-
8750
-
0
-
0
Design Patterns-الگوی Builder
Builder
در این مقاله به معرفی یکی دیگر از الگوهای طراحی با نام Builder خواهیم پرداخت.
در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق لینک های زیر قابل دسترس هستند:
- Design Patterns
- Singleton Pattern
- Simple Factory Pattern
- Abstract Factory Pattern
- Factory Method Pattern
- Prototype Pattern
GOF این الگو را به این شکل تعریف کرده اند که "با استفاده از Builder Pattern، ساختار (construction) اشیاء پیچیده را از نمایش (representation) آن جدا میکنیم. بنابراین می توان با یک فرایند ساخت، چند نمایش مختلف ایجاد کرد ".
خوب بیایید با هم معنی این تعریف را بهتر درک کنیم. همانطور که از نام آن مشخص است، از این الگو برای ساخت اشیاء به صورت جزء به جزء یا به عبارت دیگر مرحله به مرحله استفاده می شود. منطق پیچیده ساخت شی از client جدا شده است و client با ارسال مجموعه ای از جزئیات، شی و اطلاعات
مورد نیاز را بدست می آورد.
برای مثال، برای ساخت یک ماشین، اول باید بدنه آن را بسازیم، سپس موتور، صندلی ها و غیره. الگوی Builder نیز از این رویکرد پیروی میکند.
الگوی Builder از چهار جزء زیر تشکیل می شود:
Product
Builder
Concrete Builder
Director
حال اجازه دهید ببینیم چطور همان مثال ماشین را پیاده سازی کنیم:
اول از همه، باید یکسری enum بسازیم و قطعات را مشخص کنیم:
public enum BodyType
{
HatchBack,
Sedan,
SUV
}
public enum EngineType
{
Petrol,
Diesal,
Hybrid
}
public enum SeatType
{
Regular,
SemiSleeper,
Sleeper
}بنابراین اجزاء آماده هستند. حالا باید یک product بسازیم، مثلاً یک ماشین (Car). لازم است برای کلاس Car یکسری Attribute ، برای ساخت یک ماشین، تعریف کنیم.
class Car
{
string carName;
public Car(stringcarName)
{
this.carName = carName;
}
public string CarName
{
get
{
return carName;
}
}
public BodyType CarBodyType
{
get;
set;
}
public EngineType CarEngineType
{
get;
set;
}
public SeatType CarSeatType
{
get;
set;
}
public string GetDetails()
{
return string.Format("Name: {0}\nBodyType: {1}\nEngineType: {2}\nSeatType: {3}", CarName, CarBodyType, CarEngineType, CarSeatType);
}
}پس از ساخت Product (در این مثال ماشین)، نوبت به ساخت Builder می رسد. در Builder یکسری متد برای ساخت اجزاء مختلف Product وجود دارد.
interface ICarBuilder
{
void BuildBody();
void BuilEngine();
void BuilSeats();
Car MyCar
{
get;
}
} تا اینجا ما Builder را ساخته ایم. حالا برای ساخت ماشین های مختلف باید Concrete Builder را ایجاد کنیم و تنوع سفارشات ارسال شده از طرف client را مدیریت کنیم. برای مثال اگر بخواهیم ماشین هایی مثل Maruti و یا Skoda بسازیم، باید 2 Concrete Builder داشته باشیم، مثل MarutiCarBuilder و SkodaCarBuilder.
class MarutiCarBuilder: ICarBuilder
{
Car car = null;
public MarutiCarBuilder()
{
car = new Car("Maruti");
}
public void BuildBody()
{
car.CarBodyType = BodyType.HatchBack;
}
public void BuildEngine()
{
car.CarEngineType = EngineType.Petrol;
}
public void BuildSeats()
{
car.CarSeatType = SeatType.Regular;
}
public Car MyCar
{
get
{
return car;
}
}
}
class SkodaCarBuilder: ICarBuilder
{
Car car = null;
public SkodaCarBuilder()
{
car = new Car("Skoda");
}
public void BuildBody()
{
car.CarBodyType = BodyType.Sedan;
}
public void BuilEngine()
{
car.CarEngineType = EngineType.Diesal;
}
public void BuilSeats()
{
car.CarSeatType = SeatType.SemiSleeper;
}
public Car MyCar
{
get
{
return car;
}
}
}امیدوارم تا به اینجا به زیبایی و قدرت الگوی Builder پی برده باشید که برای ساخت هر ماشینی باید یک سازنده برای آن ماشین ایجاد کنیم.
بنابراین سه جزء غیر اصلی از الگوی Builder ایجاد کردیم: Product، Builder و Concrete Builder. حال باید جزء آخر یعنی Director را ایجاد کنیم. به همین دلیل برای آن یک متد ایجاد میکنیم تا با گرفتن شی Builder مناسب، Product را ایجاد کند.
class CarManufacturer
{
public void BuildCar(ICarBuildercarBuilder)
{
carBuilder.BuildBody();
carBuilder.BuilEngine();
carBuilder.BuilSeats();
}
}اجازه دهید ببینیم چطور client از تنظیمات انجام شده استفاده می کند:
static void Main()
{
Console.Title = "Builder pattern demo";
CarManufacturercarMfg = newCarManufacturer();
ICarBuildercarBuilder = null;
////Build Maruti Car
carBuilder = newMarutiCarBuilder();
carMfg.BuildCar(carBuilder);
Console.WriteLine("Built Car Specs are:\n\n{0}", carBuilder.MyCar.GetDetails());
////Build Skoda car
carBuilder = newSkodaCarBuilder();
carMfg.BuildCar(carBuilder);
Console.WriteLine("Built Car Specs are:\n\n{0}", carBuilder.MyCar.GetDetails());
}خروجی:
مطالب بسیار عالی بود،از شما کمال تشکر را دارم.