الگوی طراحی Builder چیست و چه کاربردی دارد



visibility  
mode_comment   ۰

در سال 1994 گروه 4 نفره Gang of Four که به اختصار با نام GOF شناخته می شوند 23 الگوی طراحی را که توسط کریستوف الکساندر (Christopher Alexander) توسعه داده شده بودند، طبقه بندی و ارائه کردند. یکی از الگوهای طراحی که توسط آن ها به منظور ساخت اشیا در فرآیند برنامه نویسی نرم افزارها ارائه شد، الگوی طراحی سازنده یا Builder نام دارد.

الگوی طراحی BUILDER سازندهاین الگوی طراحی یک الگوی طراحی سازنده یا Creational است که با هدف تسهیل ساخت اشیای پیچیده در طراحی نرم افزار به کار برده می شود. این الگو به شما کمک می کند که پیچیده ترین اشیا را به صورت گام به گام و به وسیله اشیای ساده تر ایجاد کنید تا بتوانید انواع مختلفی از یک شی را با استفاده از همان ساختار پایه تولید کنید.

چرا باید از الگوی طراحی Builder استفاده کنیم

گاهی در فرآیند طراحی یک نرم افزار نیاز به ساخت و تعریف اشیایی پیچیده با پارامترهای زیاد خواهید داشت. عملیات مقداردهی اولیه پارامترهای همچین اشیایی در سازنده ی آن ها (Constructor) تصور کنید. برای این کار باید تعداد زیادی پارامتر را به سازنده آن اشیا ارسال شود، که این کار باعث افزایش پیچیدگی و کاهش خوانایی کدها در نرم افزار خواهد شد.

الگوی طراحی سازنده builder

به عنوان مثال، فرض کنید که می خواهید یک خانه طراحی و ایجاد کنید. برای ساخت یک خانه ساده، شما تنها نیاز به ساخت چهار دیوار و یک کف، نصب درب، جایگذاری پنجره و در نهایت ساخت یک سقف خواهید داشت. برای این کار شما باید یک کلاس (Class) خانه ایجاد کنید. اما اگر تصمیم بگیرید که یک خانه بزرگ تر و روشن تر با یک حیاط خلوت و سایر امکانات رفاهی از جمله سیستم گرمایشی، لوله کشی، سیم کشی برق و... داشته باشید، آیا به سادگی می توانید همه این امکانات را در کلاس خانه اضافه کنید؟

قطعا خیر! زیرا در آن صورت باید تعداد بسیار زیادی پارامتر را برای مقدار دهی به سازنده (Constructor) کلاس خانه ارجاع دهید. این عمل باعث افزایش پیچیدگی و کاهش خوانایی کدهای نرم افزار خواهد شد. همچنین امکان دارد در اغلب موارد، بسیاری از پارامترها استفاده نشده باقی بمانند، که باعث کثیف شدن کدنویسی می شوند. به عنوان مثال، اگر فقط یک خانه دارای استخر شنا باشد، پارامترهای مربوط به استخر شنا برای ساخت خانه های بدون استخر خالی (null) خواهند ماند.

الگوی طراحی سازنده یا builder

همچنین می توانید انواع امکانات و ساختارهای مختلف را برای خانه ای که در نظر گرفته اید، پیش بینی و شناسایی کنید. پس از شناسایی این موارد، هر کدام از آن ها را یک کلاس فرزند (subclass) از کلاس خانه (superclass) در نظر بگیرید. سپس به کمک یک Interface یا کلاس Abstract، کلاس والد (خانه) را با کلاس های مورد نظر گسترش (extend) می دهیم. با این کار اگر در آینده امکاناتی جدید برای افزودن به خانه در نظر گرفته شد، راحت‌ تر می توانید آن را پیاده سازی کنید. زیرا در این روش شما یک کلاس خانه دارید که در هر زمان می توانید آن را به وسیله مجموعه ای از کلاس های فرزند گسترش دهید.

شاید از نظر شما این ساده ترین و بهترین راه است که کلاس پایه (خانه) را گسترش داده و مجموعه ای از کلاس های فرزند را برای پوشش ترکیب ها و امکانات مختلف پارامترها ایجاد کنید. اما این روش در نهایت شما را با تعداد قابل توجهی از کلاس های فرزند رو به رو خواهد کرد. نکته قابل توجه در این روش این است که با اضافه شدن امکانات و پارامترهای جدید، تعداد کلاس های فرزند بیشتر و بیشتر خواهد شد. به همین منظور رویکردی بهینه برای انجام اینگونه کارها به وجود آمد که همان الگوی طراحی Builder است.

راه حل ارائه شده توسط الگوی طراحی Builder

الگوی طراحی سازنده یا builder

الگوی سازنده روشی را برای ساخت اشیا پیچیده پیشنهاد می دهد که روند ساخت آن ها را بسیار ساده تر می کند. در این روش به جای اینکه پارامترهای زیادی را به یک Constructor ارسال شود یا از تعداد زیادی Constructor استفاده شود، کلاسی را ایجاد می کنند که وظیفه ساخت اشیا را بر عهده بگیرد. برای این کار باید کدهایی که وظیفه ساخت اشیا را بر عهده دارند از کلاس مربوط به اشیا بیرون کشیده شوند. سپس باید این کدها در کلاسی جدید قرار گیرند که به آن کلاس Builder می گویند. از این پس، برای ساخت اشیا از کلاس Builder استفاده می شود.

کلاس builder ساخت بخش های مختلف شی را به مجموعه ای از مراحل تقسیم بندی می کند. مثلا ساختن دیوارها، درها و... . مزیتی که این روش نسبت به روش های قبلی دارد این است که دیگر نیازی به انجام تمام مراحل برای ساخت یک شی نخواهد بود. بر این اساس برای ساخت یک شی با ساختاری خاص، تنها مراحل مورد نیاز انجام می شوند. امکان دارد برخی از مراحل ساخت یک شی نسبت به اشیای دیگر متفاوت باشد. به عنوان مثال، دیوارهای یک کلبه ممکن است از چوب ساخته شوند، اما دیوارهای قلعه باید از جنس سنگ باشند.

الگوی طراحی سازنده یا builder

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

بنابراین با فراخوانی هر یک از این سازندگان به منظور ساخت یک خانه، در حالی که همه آن ها مراحل مشابه ای برای ساخت آن خانه را طی کرده اند ولی خانه هایی متفاوت به شما تحویل خواهند داد. اولین سازنده خانه ای مانند کلبه و از جنس چوب برای شما آماده کرده است. دومین سازنده با استفاده از سنگ و آهن یک قلعه مستحکم را ساخته است. در نهایت سومین سازنده خانه ای گران قیمت از جنس طلا و الماس در اختیار شما قرار خواهد داد. بنابراین با استفاده از الگوی طراحی Builder می توانید انواع مختلفی از یک شی پیچیده را با مراحلی مشخص ایجاد کنید. اگرچه این کار زمانی امکان پذیر است که کدی که مراحل ساخت اشیا را فراخوانی می کند قادر به برقراری ارتباط با کلاس های سازنده از طریق یک Interface مشترک باشند.

همچنین می توانید یک کلاس به نام Director ایجاد کنید که مراحل ساخت اشیا را به کلاس های سازنده بدهد. به عبارتی دیگر کلاس Director وظیفه دارد مراحل ساخت اشیا را تعیین کند تا کلاس های سازنده این مراحل را اجرا کنند. ساختن یک کلاس Director در نرم افزار ضروری نخواهد بود. کلاس Director مانند یک پیمانکار ساختمانی است که وظیفه دارد وظایف و مراحل ساخت یک خانه را برای سازندگان آن مشخص کند. بنابراین برای ساخت اشیا، دیگر نیازی به کار با کلاس های سازنده نخواهد بود و فقط کافی است کلاس Director به کلاس های سازنده متصل شود. سپس برای ساخت کلاس ها، کلاس Director را اجرا شود تا در نهایت نتایج نهایی از همین کلاس دریافت شوند.

کاربردهای الگوی طراحی Builder

به کارگیری الگوی طراحی سازنده در طراحی نرم افزارها، با افزایش انعطاف پذیری و خوانایی کدها همراه خواهد بود. البته از طرفی دیگر پیاده سازی این الگو نیازمند ساخت چندین کلاس و تابع اضافه است. الگوی طراحی سازنده در موارد زیر کاربردی خواهد بود :

  • امکان ساخت نمونه های مختلفی از یک شی را فراهم می سازد (برای مثال خانه های چوبی، سنگی و...).
  • باعث جلوگیری از ساخت تعداد زیادی Constructor برای ساخت اشیا می شود.
  • ساخت اشیای پیچیده و مرکب را ساده تر می کند.

روش پیاده سازی الگوی طراحی Builder

برای پیاده سازی الگوی طراحی سازنده نیازمند طی کردن چندین گام خواهیم بود. پس از آشنایی با مراحل پیاده سازی این الگوی طراحی، به بررسی مثالی از الگوی طراحی سازنده با استفاده زبان برنامه نویسی PHP خواهیم پرداخت. در این مثال مراحل ساخت یک خانه با استفاده از الگوی طراحی سازنده را بررسی خواهیم کرد. مراحل پیاده سازی این الگو عبارتند از :

  1. ابتدا باید از این موضوع اطمینان حاصل شود که به طور واضح و دقیق تمام اقدامات و مراحل لازم برای ساخت تمامی نمونه های  شی مورد نظر (محصول) تعریف شده باشند. در غیر اینصورت پیاده سازی این الگوی طراحی امکان پذیر نخواهد بود.
  2. سپس این مراحل باید در یک Interface با نام Builder تعریف شوند.
  3. در سومین گام باید یک کلاس Builder برای هر یک از نمونه های شی مورد نظر ایجاد شود. این کلاس ها باید Interface ساخته شده در گام قبلی را Implement کنند. به عبارتی دیگر همه آن ها باید از مراحل ساخت و ساز تعریف شده پیروی کنند.
  4. همچنین می توان از کلاس دیگری به نام Director برای مدیریت و پیاده سازی مراحل قبل استفاده کرد. این کلاس می تواند از راه های مختلفی به ساخت اشیا با استفاده از همان Builder ها بپردازد.
  5. بنابراین ابتدا باید کلاس های Director و Builder ایجاد شوند. سپس باید قبل از اینکه عملیات ساخت شی آغاز شود، کلاس Builder به کلاس Director مرتبط شود. این ارتباط یک بار به وسیله ارسال پارامترهای کلاس Builder در Constructor کلاس Director ایجاد می شود. با این کار کلاس Director در ساخت و سازهای بعدی از Builder استفاده می کند. البته برای این منظور یک راه حل جایگزین نیز وجود دارد. در راه حل دوم می توان Builder ها را به صورت مستقیم در تابعی (Method) که وظیفه ساخت در کلاس Director را دارد، وارد کنید.
  6. در نهایت اگر تمام اشیا از همان Interface پیروی کنند می توان نتایج ساخت و ساز را به صورت مستقیم از کلاس Director دریافت کرد. در غیر اینصورت باید نتایج از همان کلاس Builder دریافت شوند.

نتیجه گیری

الگوی طراحی سازنده راه حل بسیار مطمئنی برای حل مشکلات مربوط به ساخت اشیا پیچیده ارائه می دهد. با استفاده از این تکنیک به راحتی می توان نمونه های مختلفی از یک شی با پارامترها و خصوصیات متفاوت ساخت. این تکنیک برنامه نویسی به بهبود انعطاف پذیری و خوانایی کدهای نرم افزار کمک بسیار زیادی میکند. آیا شما تا کنون از این الگوی طراحی در نرم افزارهای خود استفاده کرده اید؟ پیاده سازی بهترین راه حل های برنامه نویسی در طراحی نرم افزارها چقدر برای شما حائز اهمیت است؟

متخصص PHP
اگر دوست داری برنامه نویسی PHP رو حرفه ای یاد بگیری آیا می دانید بیش از ۸۰% وب سایت های موجود در ایران از جمله لیدرهای بازار وب (اسنپ، اسنپ فود، نت برگ، دیجیکالا، الوپیک و ... ) زبان برنامه نویسی PHP را به عنوان زبان اصلی برای پیاده سازی امکانات سمت سرور خود انتخاب کردند! متخصص PHP arrow_back
7Learn Experts
comment دیدگاه کاربران

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :