آموزش دیزاین پترن Multiton Design Pattern
- توسط : علی حسین شهابی
- 0 نظر
سلام
خب نوبت میرسه به معرفی یکی دیگه از دیزاین پتر های php به نام multiton .
این دیزاین پترن (Design Pattern)یک دیزاین پترن Creational یا تولیدی است زیرا نحوه ساخت آبجکت ها را کنترل می کند .
دیزاین پترن multiton گسترش داده شده ی دیزاین پترن singleton هست و یه جورایی کار دیزاین پترن singleton را بسط می دهد . در واقع این دیزاین پترن (Design Pattern) به ما امکان می دهد تا به تعداد محدود و مشخصی از یک کلاس بتوان نمونه سازی شود و به عبارتی تعداد اشیایی که می توان از یک کلاس داشت را محدود کرد و این کار را با اختصاص دادن یک کلید به هر کدام از اون اشیا , انجام می یابد به این صورت که برای هر کلید یک آبجکت ساخته می شود .
روند کار به این صورت است که وقتی درخواستی مبنی بر ساخت آبجکت داده می شود ابتدا یک کلید به آن اختصاص می یابد . سپس این کلید به متد استاتیکی که وظیفه ساخت آبجکت دارد ارسال می شود . متد استاتیک چک مکند آیا با این کلید قبلا آبجکتی ساخته شده یا غیر (در واقع این کلید تکراری هست یا خیر) . اگر تکراری بود همان آبجکت قبلی را برمیگرداند و اگر جدید بود یک آبجکت جدید ساخته و آن را بر میگرداند.
قوانین دیزاین پترن multiton
- مانند دیزاین پترن singleton , دیزاین پترن (Design Pattern) مالتی تون هم باید دارای یک تابع سازنده __construct() از نوع private باشد تا نشه از کلاس به صورت معمولی با new آبجکت ساخت و نمونه ساختن با استفاده از متد استاتیکی که تعریف می کنیم انجام شود .
- هر دیزاین پترن (Design Pattern) مالتی تون در نمونه آبجکتی که ساخته می شود باید در پروپرتی $instances در کلاسمون ذخیره شود .
- زمانی که متد getInstance() صدا زده می شود باید یک مقدار به آن پاس داده شود که این مقدار به عنوان کلید در نظر گرفته می شود . هنگامی که خاستیم آبجکت هایمان را داخل پروپرتی $instances ذخیره کنیم.از این کلید به عنوان ایندکس آرایه استفاده می نماییم .
- برای بازیابی هر آبجکت , باید کلید آن به متد 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;