bidak
داره كولاك ميكنه!
پست: 121
عضو شده در: 29 تیر 1392
امتياز: 1376
|
عنوان: Singleton pattern |
|
|
سلام.
قبلا مطلبی نوشتم در این لینک, که در اینکلود کردن فایل هاتون به مشکل نخورید.
این مشکل در ساخت آبجکت از یک کلاس هم وجود داره.
در جاهای مختلف پروژه ما از یک کلاس , آبجکتی میسازیم و ممکنه چندین بار در پروژه عمل new کردن و ساختن یک آبجکت از کلاس رو انجام داده باشیم , ولی ما در هر بار اجرای اسکریپت نیاز به ساخت یک آبجکت از کلاس داریم و نمیخوایم چندین بار در پروژه از یک کلاس , آبجکت ساخته بشه.
برای حل این مشکل از معماری Singleton استفاده میکنیم.
با استفاده از این معماری , دیگه نیاز نیست به فکر چند بار آبجکت ساختن , باشیم و با خیال راحت در همه ی جای پروژه , آبجکتی از کلاس میسازیم و تنها در صورت وجود نداشتن شی ء , آبجکت جدید ساخته میشه.
در کلاسی که میخوایم از معماری Singleton استفاده کنیم , کافیه یک متد static بسازیم.
یک نمونه از معماری در کلاس دیتابیسمون:
کد: |
class Database
{
private static $instance;
public function __construct()
{
// connection
}
// Singleton Design Pattern
public static function getInstance()
{
if(self::$instance === null)
{
self::$instance = new Database();
}
return self::$instance;
}
}
|
* متد های static , مانند function های خارج از کلاس هستن و برای فراخوانی آبجکتی نمیسازیم.
حالا برای صدا زدن کلاس , در پروژه متد getInstance رو صدا بزنیم.به این صورت:
کد: |
// this is an object of db class
$obj = Database::getInstance();
|
* متد های static برای صدا زدن , اول نام کلاس مربوطه میاد و بعد از ( :: ) , نام متد.
اگر چندین بار پشت سر هم صدا بزنید , باز هم یک آبجکت ساخته میشه.بخاطر وجود این شرط:
کد: |
if(self::$instance === null)
|
روش دیگری برای پیاده سازی این معماری:
کد: |
class Singleton
{
private static $instance;
public function __construct()
{
if(!self::$instance)
{
self::$instance = $this;
echo 'a new object is created...';
}
return self::$instance;
}
}
$obj1 = new Singleton();
$obj2 = new Singleton();
$obj3 = new Singleton();
$obj4 = new Singleton();
$obj5 = new Singleton();
|
اینجا چون کدهای مربطه رو در constructor نوشتیم , در هر بار new اولین کدهایی که اجرا میشن , کدهای سازنده (constructor) هستن , یعنی با هربار new کردن کلاس , متد constructor صدا زده میشه.
* در تمام new کردن ها ازین کلاس , تنها یکبار , آبجکت ساخته میشه. |
|