Wzorce projektowe, cz. 1 Singleton

Tym postem rozpoczynam kolejny cykl postów – tym razem o wzorcach projektowych przydatnych w projektowaniu i programowaniu aplikacji webowych. Na początek opiszę jeden z najprostszych, a zarazem dość popularny wzorzec – Singleton.

Singleton jest jednym z najprostszych wzorców projektowych. Jego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu – jest to obiektowa alternatywa dla zmiennych globalnych.


Diagram klasy wzorca Singleton

Singleton implementuje się poprzez stworzenie klasy, która posiada statyczną metodę getInstance(). Metoda ta sprawdza, czy istnieje już instancja tej klasy, jeżeli nie – tworzy ją i przechowuje jej referencję w prywatnym polu. Aby uniemożliwić tworzenie dodatkowych instancji, konstruktor klasy deklaruje się jako prywatny lub chroniony.

Przykładowa implementacja

<?php
class Singleton {
    private static $instance;
    private function __construct() {}
    private function __clone() {}
    public static function getInstance() {
        if(self::$instance === null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
}
$singleton = Singleton::getInstance();
?>

Przykład z życia wzięty

Rozważmy klasę zawierającą konfigurację aplikacji.

<?php
class Config {
    private static $instance;
    private $config = array(
        "login"     =>  "mojlogin",
        "password"  =>  "haslo",
        "language"  =>  "pl"
        );

    private function __construct() {}
    private function __clone() {}

    public static function getInstance() {
        if(self::$instance === null) {
            self::$instance = new Config();
        }
        return self::$instance;
    }
    public function setLanguage($lang) {
        $this->config["language"] = $lang;
    }
    public function getLanguage() {
        return $this->config["language"];
    }
}

// testy
$conf1 = Config::getInstance();
echo $conf1->getLanguage(); // wyswietla "pl"
$conf2 = Config::getInstance();
$conf2->setLanguage("en");
echo $conf1->getLanguage(); // wyswietla "en"
?>

Klasa Config zawiera tablicę z podstawowymi ustawieniami aplikacji. Dzięki zastosowaniu Singletona zmiana ustawień w jednym miejscu (np. zmiana języka na stronie przez użytkownika) jest „widoczna” w każdym miejscu aplikacji. Ponadto można łatwo zaprojektować klasę z konfiguracją, tak by było można łatwo dodawać kolejne ustawienia w miarę potrzeb.

Zalety i wady

Zalety:

  • Pobieranie instancji klasy jest niewidoczne dla użytkownika. Nie musi on wiedzieć, czy w chwili wywołania metody instancja istnieje czy dopiero jest tworzona.
  • Tworzenie nowej instancji zachodzi dopiero przy pierwszej próbie użycia.
  • Klasa zaimplementowana z użyciem wzorca singleton może samodzielnie kontrolować liczbę swoich instancji istniejących w aplikacji.

Wady:

  • Brak elastyczności, ponieważ już na poziomie kodu, na „sztywno” określana jest liczba instancji klasy.
  • Utrudnia testowanie i usuwanie błędów w aplikacji.

Zastosowanie

Programując w PHP używa się wzorca Singleton do przechowywania konfiguracji aplikacji oraz utrzymania połączenia z bazą danych. Jednak, warto pamiętać o wadach tego wzorca i korzystać z niego rozważnie. Zbyt częste stosowanie wzorca Singleton pogarsza przejrzystość kodu.

Powiązane tematy

Print Friendly, PDF & Email