آموزش دیزاین پترن Prototype Design Pattern

  • خانه
  • آموزش دیزاین پترن Prototype Design Pattern
Image تحقیقات

آموزش دیزاین پترن Prototype Design Pattern

با سلام

مبحث امروز درباره یکی دیگر از دیزاین پترن های آموزش phpبه نام Prototype است .

قبل از هر چیز بگم که این دیزاین پترن از نوع creational یا تولیدی است زیرا نحوه ساخت آبجکت را کنترل می کند .

از این دیزاین پترن به منظور ایجاد یک شی جدید به واسطه کپی (clone) کردن یک شی که قبلا ایجاد شده است استفاده می شود  که به اصطلاح می گویند یک clone از شی گرفته شده است .

آبجکت (object) جدید می توانید دقیقا شبیه همان آبجکت یا کلاس اصلی باشد و یا تغییراتی داشته باشد . پس می توان گفت زمانی از دیزاین پترن Prototype استفاده می کنیم که نیاز به یک شی جدید داشته باشیم ولی ایجاد شی از نظر زمانی و یا مصرف منابع (resource) مقرون به صرفه نباشد به همین دلیل از شی قبلیمون یک کپی یا clone میگیریم .

دو نوع کپی یا clone داریم  :

  1. shallow (به معنی کم عمق) : وقتی به صورت کم عمق عمل clone انجام شود تغییراتی که در آبجکت (object) جدید داده می شود در آبجکت (object) اصلی ما نیز اعمال می شود .
  2. deep (به معی پر عمق) : وقتی به صورت پر عمق عمل clone انجام شود تغییراتی که در آبجکت (object) جدید داده می شود در آبجکت (object) اصلی تاثیری نمیگذارد . در واقع تو آبجکت کاملا جدا از هم هستند بدون هیچ گونه وابستگی ای .

به صورت پیشفرض دیزاین پترن Prototype کپی از نوع deep ایجاد می کند .

 

محاسن دیزاین پترن Prototype :

مزیت اصلی این دیزاین پترن این است که سرعت کپی یک آبجکت از آبجکت دیگر خیلی سریع تر از ساخت همان آبجکت می باشد زیرا موقع کپی , متد سازنده ی آبجکت (constructor ) دیگر اجرا نمی شود .

 

اشکلات دیزاین پترن Prototype :

اشکال اصلی دیزاین پترن Prototype همان اجرا نشدن متد سازنده ی آبجکت (constructor ) موقع کپی است زیرا خیلی از برنامه نویسان عادت دارند گوشه ای از منطق کارشون رو در متد سازنده ی کلاس ها بنویسند .

 

قانون های دیزاین پترن Prototype :

حتما لازم است یک مجیک متد به نام __clone() در کلاس خودمون داشته باشیم..اصلن مهم نیست داخل این متد محتوایی باشد یا خیر .

مثال :

/**
 * A class to represent the CocaCola drink
 */
class CocaCola {
    
    private $fizzy;
    private $healthy;
    private $tasty;
 
    /**
     * init a CocaCola drink
     */
    public function __construct() {
        $this->fizzy   = true;
        $this->healthy = false;
        $this->tasty   = true;
    }
 
    /**
     * This magic method is required, even if empty as part of the prototype pattern
     */
    public function __clone() {
    }
 
}
 
$cola = new CocaCola();
 
/*
 * object(CocaCola)#1 (3) {
 *   ["fizzy":"CocaCola":private]=>
 *   bool(true)
 *   ["healthy":"CocaCola":private]=>
 *   bool(false)
 *   ["tasty":"CocaCola":private]=>
 *   bool(true)
 * }
 */
var_dump($cola);
 
$colaClone = clone $cola;
 
/*
 * object(CocaCola)#2 (3) {
 *   ["fizzy":"CocaCola":private]=>
 *   bool(true)
 *   ["healthy":"CocaCola":private]=>
 *   bool(false)
 *   ["tasty":"CocaCola":private]=>
 *   bool(true)
 * }
 */
var_dump($colaClone);