در دو مقاله قبلی، ما در مورد الگوی Builder Design و Fluent Builder به همراه Generic بازگشتی صحبت کردیم. ما توصیه میکنیم که حداقل مقاله اول را برای درک بهتر الگوی Builder Design مطالعه کنید. دومین مقاله، مقاله ارتقا یافته از مقاله اول است و اگر میخواهید بیشتر در مورد استفاده از generic بازگشتی با الگوی Builder را یاد بگیرید، توصیه میکنیم این مقاله دوم را نیز بخوانید.
این مقاله، بخشی از مجموعه آموزشی زیر است:
- الگوی طراحی Builder و Fluent Builder
- اینترفیس Fluent Builder به همراه Generic بازگشتی
- Facated Builder
- متد Factory
- Singleton
- Adapter
- Composite
- Decorator
- Command
- Strategy
- Facade
چرا ما به Faceted Builder نیاز داریم؟
بعضی اوقات ما ممکن است یک آبجکت complex داشته باشیم و فرآیند خلق آبجکت به بیش از یک کلاس builder نیاز داشته باشد. بنابراین، کاری که ما باید انجام دهیم این است که چندین کلاس builder را به گونه ای معرفی کنیم که بتوانیم هنگام ایجاد آبجکت خود، از یک builder به builder دیگر بپریم.
رویکرد Faceted Builder به مقدار قابل توجهی در این فرآیند به ما کمک میکند، زیرا ما یک facade را بر روی builder های خود میسازیم و آن facade به ما اجازه میدهد تا تمام آن builder ها را برای ایجاد یک آبجکت واحد استفاده کنیم.
حالا یاد بگیریم که چطور باید این کار را انجام دهیم.
برای مشاهده لیست کامل مقالات این مجموعه آموزشی، الگوهای طراحی #C را بررسی کنید.
این مقاله، به دو قسمت زیر تقسیم میشود:
پیاده سازی Faceted Builder
ما میخواهیم کارمان را با ایجاد یک آبجکت مدل “complex” شروع کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Car { public string Type { get; set; } public string Color { get; set; } public int NumberOfDoors { get; set; } public string City { get; set; } public string Address { get; set; } public override string ToString() { return $"CarType: {Type}, Color: {Color}, Number of doors: {NumberOfDoors}, Manufactured in {City}, at address: {Address}"; } } |
ما در این آبجکت مدل، یک قسمت اطلاعات داریم و یک قسمت آدرس. بنابراین میخواهیم از دو builder برای ایجاد کل این آبجکت استفاده کنیم.
همانطور که قبلا گفتیم، یک facade نیاز داریم. بنابراین با آن شروع میکنیم:
1 2 3 4 5 6 7 8 9 10 11 |
public class CarBuilderFacade { protected Car Car { get; set; } public CarBuilderFacade() { Car = new Car(); } public Car Build() => Car; } |
ما آبجکت Car را که میخواهیم build کنیم و از طریق متد Build، آن را در معرض استفاده قرار دهیم را نمونه سازی میکنیم.
چیزی که ما در حال حاضر نیاز داریم ایجاد builder های مربوطه است. بنابراین با CarInfoBuilder شروع میکنیم که باید از کلاس facade ارث بری کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class CarInfoBuilder: CarBuilderFacade { public CarInfoBuilder(Car car) { Car = car; } public CarInfoBuilder WithType(string type) { Car.Type = type; return this; } public CarInfoBuilder WithColor(string color) { Car.Color = color; return this; } public CarInfoBuilder WithNumberOfDoors(int number) { Car.NumberOfDoors = number; return this; } } |
همانطور که می بینیم، از طریق سازنده، آبجکتی را که می خواهیم بسازیم را دریافت می کنیم و از اینترفیس fluent برای هدف ساخت استفاده می کنیم.
همین کار را برای کلاس CarAddresBuilder
نیز انجام میدهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class CarAddressBuilder: CarBuilderFacade { public CarAddressBuilder(Car car) { Car = car; } public CarAddressBuilder InCity(string city) { Car.City = city; return this; } public CarAddressBuilder AtAddress(string address) { Car.Address = address; return this; } } |
در این لحظه، ما دو کلاس builder داریم. اما هنوز ساخت آبجکتمان را نمیتوانیم شروع کنیم، چرا که ما builder های خود را در کلاس facade قرار نداده ایم. پس این کار را انجام میدهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class CarBuilderFacade { protected Car Car { get; set; } public CarBuilderFacade() { Car = new Car(); } public Car Build() => Car; public CarInfoBuilder Info => new CarInfoBuilder(Car); public CarAddressBuilder Built => new CarAddressBuilder(Car); } |
از این لحظه، ما می توانیم ساخت آبجکت خود را شروع کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Program { static void Main(string[] args) { var car = new CarBuilderFacade() .Info .WithType("BMW") .WithColor("Black") .WithNumberOfDoors(5) .Built .InCity("Leipzig ") .AtAddress("Some address 254") .Build(); Console.WriteLine(car); } } |
و تمام. ما آبجکت خود را با رویکرد Faceted Builder ساختیم.
نتیجه گیری
با این مقاله، ما به پایان این سری آموزشی کوتاه از آموزش الگوی طراحی Builder رسیدیم. اما مقالات بیشتری در مورد الگوهای طراحی در #C پیش رو داریم. پس در مقالات بعدی با ما همراه باشید.