1.7. Singleton

1.7.1. تعریف

الگوی طراحی Singleton یک الگوی طراحی از نوع سازنده یا Creational محسوب میشه که هدفش اطمینان از اینه که یک کلاس فقط و فقط یک شی داشته باشه و یک راه دسترسی global هم براش در نظر بگیره.

زمانی که این الگو روی یک کلاس اجرا میشه، اون کلاس فقط یک شی ثابت رو برمیگردونه.

در الگوی طراحی Singleton، سازنده ی کلاس به صورت private در نظر گرفته میشه تا امکان ایجاد شی به صورت مستقیم گرفته بشه و به جای اون یک متد public در نظر میگیریم تا عملیات return کردن شی از کلاس رو انجام بده.

1.7.2. اجزاء

الگوی طراحی Singleton از چند بخش اصلی تشکیل میشه:

  1. Singleton class

  2. Private constructor

  3. Static instance variable

  4. Static getInstance() method

UML of Singleton Design Pattern

Hpesoj00, CC BY-SA 4.0, via Wikimedia Commons

1.7.3. چه زمانی استفاده میشه؟

این الگو زمانی استفاده میشه که مطمئن هستیم از کلاس مورد نظر ما در تمام برنامه فقط و فقط باید یک شی ساخته و از اون استفاده بشه.

به عنوان مثال در کل برنامه ما فقط به یک کانکشن دیتابیس واحد نیاز داریم یا در فریمورک های MVC فقط یک شی از کلاس اصلی برنامه ایجاد میشه.

Caution

✅ مزایای استفاده

*. جلوگیری از ایجاد مجدد و بی مورد شی از کلاس های مورد نظر

*. دسترسی global به شی مورد نظر

*. آبجکت Singleton فقط زمانی ایجاد میشه که بهش نیاز وجود داشته باشه

Warning

❌ معایب استفاده

*. تست نویسی برای این کلاس سخت هست

*. برای ساختارهای multithread به راحتی نمیشه اون رو پیاده سازی و استفاده کرد

*. ناقض اصل اول SOLID یعنی تک مسئولیتی هست

1.7.4. پیاده سازی

کلاس Singleton به این صورت تعریف میشه:

 1<?php
 2
 3class Singleton
 4{
 5    private static ?Singleton $instance = null;
 6
 7    private function __construct()
 8    {
 9        // Private constructor to prevent creating new instances of the Singleton class
10    }
11
12    public static function getInstance(): Singleton
13    {
14        if (self::$instance === null) {
15            self::$instance = new self();
16        }
17
18        return self::$instance;
19    }
20
21    public function doSomething(): void
22    {
23        echo "I am doing something!";
24    }
25}

1.7.5. نحوه فراخوانی

1<?php
2
3$singleton = Singleton::getInstance();
4$singleton->doSomething(); // outputs "I am doing something!"

به همین سادگی!

1.7.6. آموزش ویدیویی