الگوی سازنده(Builder) mahdi.sg مرداد ۲۴, ۱۴۰۳

الگوی سازنده


هـــدف

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

Lots of subclasses create another problem

مثال

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

ساده‌ترین راه حل این است که کلاس پایه خانه را گسترش دهید و مجموعه‌ای از زیر کلاس‌ها برای پوشش دادن تمام ترکیب‌های پارامترها ایجاد کنید. اما در نهایت با تعداد قابل توجهی از زیر کلاس‌ها مواجه خواهید شد. هر پارامتر جدید، مانند سبک ایوان، نیاز به رشد بیشتر این سلسله مراتب دارد.

رویکرد دیگری وجود دارد که شامل تولید زیر کلاس‌ها نمی‌شود. می‌توانید یک سازنده غول پیکر را درست در کلاس پایه خانه با تمام پارامترهای ممکن که شی خانه را کنترل می‌کنند ایجاد کنید. در حالی که این رویکرد در واقع نیاز به زیر کلاس‌ها را از بین می‌برد، مشکل دیگری ایجاد می‌کند.

The telescoping constructor

در بیشتر موارد، بیشتر پارامترها استفاده نخواهند شد و باعث می‌شوند فراخوانی‌های سازنده بسیار زشت شوند. برای مثال، تنها کسری از خانه‌ها دارای استخر هستند، بنابراین پارامترهای مربوط به استخر در نه مورد از ده مورد بی‌فایده خواهند بود.

الگوی سازنده پیشنهاد می‌کند که کد ساخت شی را از کلاس خود استخراج کرده و آن را به اشیاء جداگانه‌ای به نام سازنده منتقل کنید.

Applying the Builder pattern

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

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

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

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

مدیر

می‌توانید فراتر رفته و مجموعه‌ای از فراخوانی‌های مراحل ساخت برای ساخت یک محصول را به یک کلاس جداگانه به نام مدیر استخراج کنید. کلاس مدیر ترتیب اجرای مراحل ساخت را تعریف می‌کند، در حالی که سازنده پیاده‌سازی آن مراحل را ارائه می‌دهد.

داشتن یک کلاس مدیر در برنامه شما کاملاً ضروری نیست. شما همیشه می‌توانید مراحل ساخت را به ترتیب خاصی مستقیماً از کد مشتری فراخوانی کنید. با این حال، کلاس مدیر ممکن است مکان خوبی برای قرار دادن روال‌های ساخت مختلف باشد تا بتوانید آن‌ها را در سراسر برنامه خود مجدداً استفاده کنید.

علاوه بر این، کلاس مدیر جزئیات ساخت محصول را کاملاً از کد مشتری پنهان می‌کند. مشتری فقط نیاز دارد یک سازنده را با یک مدیر مرتبط کند، ساخت را با مدیر آغاز کند و نتیجه را از سازنده دریافت کند.

ســاخــتـــار

Structure of the Builder design pattern

 

برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.