سلام.
در قسمت های مختلف پروژه ما از یک کلاس , آبجکتی میسازیم و ممکنه چندین بار در پروژه عمل 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 کردن و Instance جدیدی ساختن ازین کلاس , تنها یکبار آبجکت ساخته میشه.
نویسنده: محسن موحد