من اینجا هستم تا بحث پیرامون الگوهای طراحی را ادامه دهم. امروز ما یک الگوی طراحی خلاقانه دیگر به نام Builder را مورد بحث قرار خواهیم داد.
اگر به مقاله قبلی ما نگاه نکرده اید، از طریق لینک زیر بروید:
- الگوهای طراحی ساده شده - قسمت 1
- الگوهای طراحی ساده شده - قسمت 2 (Singleton)
- الگوهای طراحی ساده شده - قسمت 3 (کارخانه ساده)
- الگوهای طراحی ساده شده - قسمت 4 (کارخانه انتزاعی)
- الگوهای طراحی ساده شده - قسمت 5 (روش کارخانه)
- الگوهای طراحی ساده شده - قسمت 6 (نمونه اولیه)
قبل از صحبت در مورد اجرای آن، اجازه دهید با تعریف آن شروع کنیم.
طبق GOF، الگوی سازنده به صورت زیر تعریف می شود.
"ساخت یک شی پیچیده را از نمایش آن جدا کنید تا فرآیند ساخت یکسان بتواند بازنمایی های متفاوتی ایجاد کند."
خوب بیایید منظور آنها را بفهمیم. همانطور که از نام آن پیداست، الگوی سازنده برای ساخت یا ساخت اشیا به صورت قطعات یا گام به گام استفاده می شود. منطق پیچیده ساخت شی از کلاینت جدا می شود و مشتری فقط با ارسال مجموعه ای از جزئیات، شی و اطلاعات مورد نیاز را دریافت می کند.
مثلاً برای ساخت خودرو ابتدا باید بدنه، موتور و صندلی و ... بسازیم. الگوی سازنده از همین رویکرد پیروی می کند.
الگوی سازنده دارای چهار جزء فرعی مانند زیر است.
- تولید - محصول
- سازنده
- بتن ساز
- کارگردان
حال، بیایید ببینیم که چگونه می توان این الگو را با مثال ماشین مشابه پیاده سازی کرد.
اولاً، ما باید تعداد کمی داشته باشیم تا قسمتها را مانند زیر مشخص کنیم.
- public enum BodyType
- {
- HatchBack,
- Sedan,
- SUV
- }
- public enum EngineType
- {
- Petrol,
- Diesal,
- Hybrid
- }
- public enum SeatType
- {
- Regular,
- SemiSleeper,
- Sleeper
- }
بنابراین، قطعات آماده هستند. حالا بیایید محصول را بسازیم. یعنی ماشین کلاس خودرو باید دارای ویژگی های مورد نیاز برای ساخت خودرو باشد.
- 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);
- }
- }
اکنون کار ساخت محصول (یعنی ماشین) تمام شده است، حالا بیلدر را ایجاد می کنیم که باید روش هایی برای ساخت بخش های مختلف محصول داشته باشد.
- interface ICarBuilder
- {
- void BuildBody();
- void BuilEngine();
- void BuilSeats();
- Car MyCar
- {
- get;
- }
- }
ما بیلدر را نیز ایجاد کرده ایم. بعدش چی؟
بعدی بتن ساز خواهد بود، اما چرا؟
خوب، سازنده بتن برای ساخت انواع اتومبیل و رسیدگی به سفارشی سازی ارسال شده از مشتری مورد نیاز است. به عنوان مثال، اگر بخواهیم خودروهای Maruti و Skoda بسازیم، باید دو سازنده بتن مانند 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 CarMyCar
- {
- 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;
- }
- }
- }
امیدوارم به زیبایی و قدرت الگوی بیلدر پی برده باشید که برای هر خودروی آینده، فقط باید یک سازنده برای آن ماشین ایجاد کنیم.
بنابراین تا به حال ما سه جزء فرعی الگوی سازنده یعنی Product، Builder و Concrete Builder را ایجاد کرده ایم. بیایید بقیه را ایجاد کنیم، یعنی Director، که روشی برای ساخت محصول با گرفتن شی سازنده مناسب خواهد داشت.
- class CarManufacturer
- {
- public void BuildCar(ICarBuildercarBuilder)
- {
- carBuilder.BuildBody();
- carBuilder.BuilEngine();
- carBuilder.BuilSeats();
- }
- }
اکنون کار راه اندازی را تمام کرده ایم. بیایید ببینیم مشتری چگونه از این استفاده می کند.
- 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());
- }
خروجی
امیدوارم مقاله مورد پسند شما واقع شده باشد. منتظر نظرات/پیشنهادات شما هستم.