17 maja 2020

Wzorce projektowe: Singleton

Singleton, często nazywany „antywzorcem„, często wspominany jako wzorzec nie mający zalet. Być może jest to spowodowane tym, że jest źle wykorzystywany ? Być może nadużywany.

Wykorzystanie Singletona

Wzorzec projektowy Singleton pomaga nam uzyskać dostęp do danych z każdego miejsca programu, jednocześnie dbając o to, że uzyskujemy jeden i ten sam obiekt danych. Często jako przykład podawane są dane dostępowe do bazy, przekazywanie ich jako argument było by mocno uciążliwe. Dzięki metodzie statycznej Singletona możemy takie dostępy uzyskać.

Przykładowy kod

class DatabaseAccess
{
    private $data = [];
    private static $instance;

    private function __construct()
    {
        $this->data = [
            'host' => '127.0.0.1',
            'user' => 'root',
            'password' => 'root'
        ];
    }

    public static function getInstance() : DatabaseAccess
    {
        if (empty(self::$instance)) {
            self::$instance = new DatabaseAccess;
        }
        return self::$instance;
    }

    public function setData(string $key, string $val) : void
    {
        $this->data[$key] = $val;
    }

    public function get(string $key):array 
    {
        return $this->data[$key];
    }
}

Nie możemy do końca ufać w jaki sposób nasza klasa zostanie wykorzystana, dla tego musimy konstruktor klasy ustawić jako metodę prywatną. Dzięki temu mamy pewność że nie powstanie więcej obiektów naszej klasy niż jeden.

Kod kliencki wyglądać będzie następująco:

$dbAccess = DatabaseAccess::getInstance();
$dbAccess->get('host');
$dbAccess->get('user');

Ustawienie nowych danych może wyglądać mniej więcej tak:

$dbAccess->set('password', 'root');