Design Patternها راه حل هایی برای مشکلات طراحی نرم افزار است که شما بارها و بارها در توسعه برنامه های کاربردی با آن ها برخورد می کنید. Patternها مربوط به reusable design و تعامل اشیاء هستند.
Builder یک الگوی طراحی سازنده(Creational) است که به شما امکان می دهد قدم به قدم اشیاء پیچیده را بسازید. الگوی Builder به شما کمک می کند که پیچیده ترین اشیاء را به صورت قدم به قدم و به وسیله اشیای ساده تر ایجاد کنید و انواع مختلفی از یک شی را با استفاده از همان ساختار پایه تولید کنید.
Problem
مشکل این است که گاهی نیاز است هنگام ساخت یک شی تعداد زیادی پارامتر را بهconstructor آن تحویل دهیم و این کار برنامه نویسی را بیشتر و خوانایی برنامه را کم میکند. به منظور حل این مشکل از الگوی Builder استفاده میکنیم. در این تکنیک به جای طراحی تعدادی constructor با تعداد زیادی پارامتر از یک شی دیگر استفاده می کنیم که کار پارامتردهی را به صورت مرحله به مرحله و خوانا تر انجام می دهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده را به ما تحویل می دهد.
هدف اصلی الگوی طراحی Builder، جداسازی نحوه ساخته شدن یک شی از مکانی است که قرار است در آنجا نمایش داده شود.
به عنوان مثال ، بیایید در مورد چگونگی ایجاد یک شیء خانه فکر کنیم. برای ساختن یک خانه ساده ، شما باید چهار دیوار و یک کف احداث کنید، یک درب نصب کنید ، یک جفت پنجره را نصب کنید و یک سقف بسازید. برای این کار شما باید یک class خانه ایجاد کنید. اما اگر بخواهید خانه ای بزرگتر ، روشن تر ، دارای حیاط خلوت و سایر امکانات رفاهی (مانند سیستم گرمایش ، لوله کشی و سیم کشی برق) داشته باشید ، چه می کنید؟ آیا به سادگی می توانید همه این امکانات را در کلاس خانه اضافه کنید؟
مسلما خیر! زیرا با ایجاد یک Constructor بزرگ باید تعداد زیادی پارامتر را برای مقدار دهی به Constructor کلاس خانه ارجاع دهید. این عمل باعث افزایش پیچیدگی و کاهش خوانایی کد خواهد شد. همچنین امکان دارد در اغلب موارد، بسیاری از پارامترها استفاده نشده باقی بمانند، که باعث کثیف شدن کدنویسی می شوند. به عنوان مثال، فقط بخشی از خانه ها دارای استخر شنا هستند و بنابراین پارامترهای مربوط به استخر شنا برای ساخت خانه های بدون استخر خالی (null) خواهند ماند.
همچنین شما می توانید انواع امکانات و ساختارهای مختلف را برای خانه ای که در نظر گرفته اید، پیش بینی و شناسایی کنید. پس از شناسایی این موارد، هر کدام از آن ها را یک subclass از کلاس خانه (superclass) در نظر بگیرید. سپس به کمک یک Interface یا کلاس Abstract، کلاس خانه را با کلاس های مورد نظر گسترش می دهید. با این روش اگر در آینده امکانات جدیدی برای افزودن به خانه در نظر گرفته شد، راحت تر می توانید آن ها را پیاده سازی کنید. زیرا در این روش شما یک کلاس خانه دارید که در هر زمان می توانید آن را به وسیله مجموعه ای از کلاس های فرزند گسترش دهید.
شاید از نظر شما این ساده ترین و بهترین راه باشد که کلاس پایه (خانه) را گسترش داده و مجموعه ای از کلاس های فرزند را برای پوشش امکانات مختلف و جدید ایجاد کنید. اما این روش در نهایت شما را با تعداد زیادی از کلاس های فرزند رو به رو می کند. نکته قابل توجه در این روش این است که با اضافه شدن امکانات و پارامترهای جدید، تعداد کلاس های فرزند بیشتر و بیشتر خواهد می شود. برای این منظور رویکرد بهینه ای برای انجام این گونه کارها به وجود آمد که همان الگوی طراحی Builder است.
راه حل بهینه توسط الگوی طراحی Builder
الگوی Builder روشی را برای ساخت اشیا پیچیده پیشنهاد می دهد که روند ساخت آن ها را بسیار ساده تر می کند. در این روش به جای اینکه پارامترهای زیادی به یک Constructor ارسال شود یا از تعداد زیادی Constructor استفاده شود، کلاسی ایجاد می گردد که وظیفه ساخت اشیا را بر عهده بگیرد. برای این کار باید کدهایی که وظیفه ساخت اشیا را بر عهده دارند از کلاس مربوط به اشیا خارج شوند و سپس این کدها باید در کلاس جدیدی قرار گیرند که به آن کلاس Builder می گویند. از این پس، برای ساخت اشیا از کلاس Builder استفاده می شود.
کلاس builder ساخت شی را به مجموعه ای از مراحل (buildWalls ، buildDoor و غیره) تقسیم می کند. مزیت این روش نسبت به روش های قبلی این است که شما برای ساخت یک شی نیازی به انجام تمام مراحل ندارید. بر این اساس برای ساخت یک شی با ساختاری خاص، تنها مراحل مورد نیاز را انجام می دهید. در این حالت ممکن است برخی از مراحل ساخت یک شی نسبت به اشیای دیگر متفاوت باشد. به عنوان مثال، دیوارهای یک کابین ممکن است از چوب ساخته شوند، اما دیوارهای قلعه باید با سنگ ساخته شوند.
UML class diagram
Participants
کلاس ها و اشیاء شرکت کننده در این الگو عبارتند از:
- Builder
یک abstract interface برای ایجاد بخش هایی از یک شیء Product مشخص می کند.
- ProductBuilder
با پیاده سازی اینترفیس Builder ، قسمت هایی از محصول را ساخته و مونتاژ می کند.
- Product
نمایانگر شیء پیچیده در دست ساخت است.
ساختار کد در C#
این کد ساختار الگوی Builder را نشان می دهد که در آن اشیاء پیچیده به روشی گام به گام ایجاد می شوند. فرایند ساخت و ساز می تواند نماهای مختلفی از شی را ایجاد کند و کنترل بالایی بر مونتاژ اشیاء داشته باشد.
خروجی کد بالا به شکل زیر می باشد: