Одиночка — это порождающий паттерн проектирования, который позволяет содержать только один экземпляр объекта в приложении, которое будет обрабатывать все обращения, запрещая создавать новый экземпляр и предоставляет к нему глобальную точку доступа.
Может использоваться для:
Одиночка имеет такие же преимущества и недостатки, что и глобальные переменные. Его невероятно удобно использовать, но он нарушает модульность вашего кода.
Вы не сможете просто взять и использовать класс, зависящий от одиночки в другой программе. Для этого придётся эмулировать присутствие одиночки и там. Чаще всего эта проблема проявляется при написании юнит-тестов.
Диаграмма UML
Реализация на PHP
final class Singleton { private static ?Singleton $instance = null; /** * gets the instance via lazy initialization (created on first usage) */ public static function getInstance(): Singleton { if (static::$instance === null) { static::$instance = new static(); } return static::$instance; } }
Производим тестирование:
declare(strict_types=1); namespace DesignPatterns\Creational\Singleton\Tests; use DesignPatterns\Creational\Singleton\Singleton; use PHPUnit\Framework\TestCase; class SingletonTest extends TestCase { public function testUniqueness() { $firstCall = Singleton::getInstance(); $secondCall = Singleton::getInstance(); $this->assertInstanceOf(Singleton::class, $firstCall); $this->assertSame($firstCall, $secondCall); } }