محسن موحد (آموزش برنامه نویسی)
محسن موحد (آموزش برنامه نویسی)
خواندن ۲ دقیقه·۳ سال پیش

آشنایی با Singleton Design 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 کردن و Instance جدیدی ساختن ازین کلاس , تنها یکبار آبجکت ساخته میشه.



نویسنده: محسن موحد

phpsingletondesign patternبرنامه نویسی
برنامه نویس متخصص PHP، Mysql، Javascript، HTML، CSS، Node.js، Android، Laravel، Yii2 - مدیر پشتیبانی فنی و سرپرست منتورها در شرکت 7learn.com
شاید از این پست‌ها خوشتان بیاید