الگوی طراحی Builder و Fluent Builder
شناسه پست: 3022
بازدید: 831

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

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

این مقاله، بخشی از مجموعه آموزشی زیر است:

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

شما میتوانید سورس را از اینجا دانلود کنید: الگوی طراحی Builder – سورس کد

برای مشاهده صفحه اصلی این سری از آموزش، الگوهای طراحی #C را بررسی کنید.

این مقاله به قسمتهای زیر تقسیم میشود:

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

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

پس، با یک کلاس ساده Product، شروع میکنیم:

ما از این کلاس فقط برای ذخیره مقداری data پایه برای یک محصول واحد استفاده میکنیم.

آبجکت گزارش موجودی ما قرار است که شامل قسمتهای header,body و footer باشد. بنابراین، کاملا منطقی است که فرایند ساخت آبجکت را به این سه عمل تقسیم کنیم. اول با کلاس ProductStockReport شروع میکنیم:

این آبجکتی است که ما قصد داریم آن را با استفاده از الگوی طراحی Builder بسازیم.

برای ادامه، ما به یک اینترفیس builder برای سازماندهی فرآیند ساخت نیاز داریم:

ما میببینیم که کلاس سازنده واقعی که قرار است این اینترفیس را پیاده سازی کند، باید تمام قسمت ها را برای آبجکت گزارش موجودی ما ایجاد کرده و آن آبجکت را نیز برگرداند. پس کلاس builder واقعی را پیاده سازی میکنیم:

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

زمانیکه منطق ساخت ما به پایان رسید، میتوانیم ساخت آبجکتمان را در یک کلاس client شروع کنیم یا حتی داخل یک کلاس Director، فرآیند ساخت را از کلاس client کپسوله کنیم. خب، این دقیقا کاری است که ما قرار است انجام دهیم:

ایجاد آبجکت StockReport

بعد از آنکه تمام کارها را انجام دادیم, میتوانیم ساخت آبجکتمان را شروع کنیم:

نتیجه:

مثال الگوی طراحی Builder

عالی. ما آبجکتمان را با استفاده از الگوی طراحی Builder ایجاد کردیم.

Fluent Builder

Fluent builder یک تغییری کوچک از الگوی طراحی Builder است که به ما این اجازه را میدهد تا فراخوانی های Builder خود را جهت اقدامات مختلف، به یکدیگر زنجیر کنیم. برای پیاده سازی Fluent builder، باید اول اینترفیس builder را تغییر دهیم:

باید پیاده سازی کلاس ProductStockReportBuilder را نیز تغییر دهیم:

در نتیجه این تغییرات، می توانیم فراخوانی ها را در کلاس Director زنجیر کنیم:

حالا اگر اپلیکیشن را اجرا کنیم، همان نتیجه را دریافت میکنیم، با این تفاوت که اینبار از اینترفیس fluent استفاده کردیم.

نتیجه گیری

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

در مقاله بعدی، ما نحوه پیاده سازی اینترفیس Fluent builder به همراه Recursive Generics را یاد میگیریم.

نویسنده

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