کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

Design Patterns-الگوی Builder

Builder

در این مقاله به معرفی یکی دیگر از الگوهای طراحی با نام Builder خواهیم پرداخت.
در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق لینک های زیر قابل دسترس هستند:


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()); 

}

خروجی:


آموزش Entity 

FrameWork به همراه Design Pattern
1395/02/05 8750 1650
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...






آموزش برنامه نویسی کاربر میهمان 1396/02/06
تشکر

مطالب بسیار عالی بود،از شما کمال تشکر را دارم.