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

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

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

زمان مورد نیاز برای مطالعه 5 دقیقه

الگوی طراحی Builder در لاراول کمک میکند دایرکتور و سازنده (Builder) با همکاری هم یک آبجکت خاص بسازند. در این مقاله به الگوی طراحی Builder در laravel میپردازیم.

دپارتمان ‌ها: آموزش برنامه نویسی
1400/05/07
3,294 بازدید

الگوی طراحی builder چیست؟

 

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

ابتدا لیستی از الگوهایی که برای استفاده در لاراول توصیه شده است را معرفی می کنیم:

•    Builder Pattern 

•    Factory Pattern 

•    Repository Pattern 

•    Strategy Pattern 

•    Provider Pattern 

•    Facade Pattern 

و اما در ادامه به تشریح الگوهای طراحی مورد استفاده در لاراول با تمرکز بر الگوی طراحی builder و نحوه استفاده از آن می پردازیم.

 

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

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

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

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

 

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

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

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

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

 

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

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

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

می توان کاربردهای الگوی طراحی Builder را به صورت زیر خلاصه کرد:

•    به منظور ساخت آبجکت های پیچیده استفاده می شود و فرآیند ساخت را ساده تر می کند.

•    می توان به روش های مختلف، یک آبجکت خاص را ساخت.

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

•    برای کاهش پیچیدگی فرآیند طراحی نرم افزار و یا اپلیکیشن به کار می رود.

 

دوره پیشنهادی و مرتبط:  آموزش لاراول پروژه محور

 

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

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

1-    تعیین مراحل لازم برای ساخت همه آبجکت ها و نمونه های مختلفی از یک آبجکت

2-    تعریف واسط سازنده یا builder interface به منظور ساخت آبجکت ها

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

4-    تعیین دایرکتور به منظور مدیریت و پیاده سازی مراحل ساخت آبجکت توسط کلاس Builder. به این منظور می توان از کلاس دایرکتور یا Director Class استفاده کرد. در این مرحله، هر کلاس Builder به کلاس دایرکتور مرتبط می شود.

5-    پس از فراخوانی کلاس Builder توسط دایرکتور، روند ساخت آبجکت آغاز می شود. می توان نتایج مربوط به آبجکت ساخته شده را به صورت مستقیم از کلاس دایرکتور دریافت کرد.

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

در این مثال، یک کلاس به نام AuthManager می بایست مؤلفه هایی را بسازد که با مؤلفه های ذخیره نظیر cookies,  sessions و یا custom که درایور نامیده می شوند، قابل استفاده باشند.

برای این منظور، کلاس AuthManager از توابعی برای ذخیره استفاده می کند مانند callCustomCreator() و getDrivers() که از کلاس Manager فراخوانی می شوند. کد PHP برای این مثال به صورت زیر است:

 


public function driver($driver = null)
{
    ...
}
protected function createDriver($driver)
{
    $method = 'create'.ucfirst($driver).'Driver';
    ...
}
protected function callCustomCreator($driver)
{
    return $this->customCreators[$driver]($this->app);
}
public function extend($driver, Closure $callback)
{
    $this->customCreators[$driver] = $callback;
    return $this;
}
public function getDrivers()
{
    return $this->drivers;
}
public function __call($method, $parameters)
{
    return call_user_func_array(array($this->driver(), $method), $parameters);
}
protected function createDriver($driver)
{
    ....
}
protected function callCustomCreator($driver)
{
    ...
}
public function createDatabaseDriver()
{
    ...
}
protected function createDatabaseProvider()
{
    ....
}
public function createEloquentDriver()
{
    ...
}
protected function createEloquentProvider()
{
    ...
}
public function getDefaultDriver()
{
    ...
}
public function setDefaultDriver($name)
{
    ...
}

با بررسی کد فوق، می توان دید که کلاس AuthManager از کلاس Manager فراخوانی می شود.

همان طور که می دانیم، لاراول اطلاعات مربوط به احراز هویت را در Database ذخیره می کند. ابتدا، کلاس AuthManager بررسی می کند که آیا پیکربندی ذخیره اطلاعات احراز هویت به صورت پیش فرض در database است یا خیر.

این کار با تابع getDefaultDriver() صورت می گیرد. در نهایت با اجرای کد فوق، کلاس AuthManager اطلاعات احراز هویت (auth) را به کمک دایرکتوری config فراخوانی می کند. 

 

قاعده های دیزاین پترن builder

برای دیزاین پترن Builder، قواعد کلی زیر را می توان در نظر گرفت:

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

•    برای پیاده سازی هر کلاس Builder، باید واسط سازنده یا builder interface مربوط به همان کلاس، مورد استفاده قرار گیرد.

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

•    از کلاس دایرکتور برای فراخوانی توابع Method داخل کلاس های Builder استفاده می شود. به عبارت دیگر، توابع Method به وسیله کلاس دایرکتور مرتبط با همان کلاس Builder، فراخوانی خواهند شد.

 

ساختار الگوی طراحی Builder

ساختار الگوی طراحی builder

ساختار یک الگوی طراحی Builder، از اجزای زیر تشکیل شده است:

•    کلاس ها

•    واسط سازنده یا builder interface

•    پیاده سازی سازنده های مختلف

•    دایرکتور که builder مناسب را برای ساخت آبجکت فراخوانی می کند.

کلاس ها انواع مختلفی دارند که عبارت اند از:

•    Product یا محصول: این کلاس نوع آبجکت که می بایست توسط الگوی طراحی Builder ساخته شود را تعریف می کند.

•    Builder: این کلاس همه مراحلی را که می بایست به منظور ساخت یک محصول درست طی شود، تعریف می کند. این کلاس معمولاً با یک واسط ساده جایگزین می شود.

•    ConcreteBuilder: این کلاس در واقع یکی از زیرمجموعه های کلاس Builder است. زیرکلاس های مختلفی از ConcreteBuilder وجود دارد که توابع مورد نیاز برای ساخت یک محصول پیچیده را در بر دارند.

•    Director: کلاس دایرکتور نیز الگوریتم تولید محصول آبجکت نهایی را کنترل می کند. این کلاس در واقع برای فراخوانی روش Construct نیز استفاده می شود.