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

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

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

سلام

خب نوبت میرسه به معرفی یکی دیگه از دیزاین پتر های php به نام multiton .

این دیزاین پترن (Design Pattern)یک دیزاین پترن Creational یا تولیدی است زیرا نحوه ساخت آبجکت ها را کنترل می کند .

دیزاین پترن multiton گسترش داده شده ی دیزاین پترن singleton هست و یه جورایی کار دیزاین پترن singleton را بسط می دهد . در واقع این دیزاین پترن (Design Pattern) به ما امکان می دهد تا به تعداد محدود و  مشخصی از یک کلاس بتوان نمونه سازی شود و به عبارتی تعداد اشیایی که می توان از یک کلاس داشت را محدود کرد  و این کار را با اختصاص دادن یک کلید به هر کدام از اون اشیا , انجام می یابد به این صورت که برای هر کلید یک آبجکت ساخته می شود .

روند کار به این صورت است که وقتی درخواستی مبنی بر ساخت آبجکت داده می شود ابتدا یک کلید به آن اختصاص می یابد . سپس این کلید به متد استاتیکی که وظیفه ساخت آبجکت دارد ارسال می شود . متد استاتیک چک مکند آیا با این کلید قبلا آبجکتی ساخته شده یا غیر (در واقع این کلید تکراری هست یا خیر) . اگر تکراری بود همان آبجکت قبلی را برمیگرداند و اگر جدید بود یک آبجکت جدید ساخته و آن را بر میگرداند.

 

قوانین دیزاین پترن multiton

  1. مانند دیزاین پترن singleton , دیزاین پترن (Design Pattern) مالتی تون هم باید دارای یک تابع سازنده __construct() از نوع private باشد تا نشه از کلاس به صورت معمولی با new آبجکت ساخت و نمونه ساختن با استفاده از متد استاتیکی که تعریف می کنیم انجام شود .
  2. هر دیزاین پترن (Design Pattern)  مالتی تون در نمونه آبجکتی که ساخته می شود باید در پروپرتی $instances در کلاسمون ذخیره شود .
  3. زمانی که متد getInstance() صدا زده می شود باید یک مقدار به آن پاس داده شود که این مقدار به عنوان کلید در نظر گرفته می شود . هنگامی که خاستیم آبجکت هایمان را داخل پروپرتی $instances ذخیره کنیم.از این کلید به عنوان ایندکس آرایه استفاده می نماییم .
  4. برای بازیابی هر آبجکت , باید کلید آن به متد getInstance() داده شود تا با استفاده از آن کلید  ,  آبجکت را بازیابی نماید .

مثال :

class Database {
 
    /**
     * Used to store and provide instances for the getInstance() method
     */ 
    private static $instances = array();
 
    /**
     * Hidden constructor, only callable from within this class
     */
    private function __construct() { }
 
    /**
     * Create a new instance if one doesn't exist with the key provided.
     * Once an instance has been created, or if it was already created, return it.
     * @param $key the key which the instance should be stored/retrieved
     * @return self
     */
    public static function getInstance($key) {
 
        // Check if an instance exists with this key already
        if(!array_key_exists($key, self::$instances)) {
            // instance doesn't exist yet, so create it
            self::$instances[$key] = new self();
        }
 
        // Return the correct instance of this class
        return self::$instances[$key];
    }
 
    /**
     * Hidden magic clone method, make sure no instances of this class 
     * can be cloned using the clone keyword
     */
    private function __clone() { }
    
}
 
// Create first instance to the master database
$master = Database::getInstance('master');
var_dump($master); // object(Database)#1 (0) { }
 
// Create second instance of this class for a logger database
$logger = Database::getInstance('logger');
var_dump($logger); // object(Database)#2 (0) { }
 
// Retrieve the existing 'master' instance from the multiton
// this would normally be done in script, which doesn't have the instance already
$masterDupe = Database::getInstance('master');
var_dump($masterDupe); // object(Database)#1 (0) { }
 
// Database objects cannot be initialise with the new keyword, doing so will cause fatal errors
// Fatal error: Call to private Database::__construct() from invalid context
$dbFatalError = new Database();
 
// Database objects cannot be cloned, doing so will cause a fatal error
// PHP Fatal error:  Call to private Database::__clone()
$dbCloneError = clone $masterDupe;