Kategorie
PHP Wzorce projektowe

Wzorzec projektowy Singleton

Wzorzec projektowy Singleton. Wyjaśnienie idei oraz implemntacja w PHP.

Wzorce projektowe to ogólne rozwiązania częstych informatycznych problemów. Programowanie obiektowe w PHP5 różni się nie tylko składnią, ale również pewnymi brakami w porównaniu z innymi językami, typu C++ czy Java. Pomimo tego wzorce projektowe idealnie sprawdzają się w aplikacjach internetowych.

Częsta sytuacja, z jaką spotykają się programiści to współdzielenie zasobów. Wszystkie zapytania do bazy danych wymagają połączenia. Taki uchwyt może być wykorzystany wielokrotnie przez różne zapytania przy tym samym żądaniu. Otwieranie i zamykanie połączeń jest najzwyczajniej, mało ekonomiczne.

Singleton

Istnieje proste rozwiązanie tego problemu. Singleton to wzorzec projektowy, który zwraca istniejącą instancję obiektu. Jeśli taka instancja nie istnieje wówczas jest tworzona. Idea rozwiązania jest bardzo prosta i idealnie pasuje do naszego problemu. Poniżej znajduje się kod klasy DB, która dziedziczy z klasy Singleton i tworzy takie połączenie do bazy.

Prawidłowa struktura klas, co zasugerował Wasacz w komentarzach, wymaga dziedziczenia klasy DB po ogólnej klasie wzorca Singleton. Niestety nie mam pomysłu zogranizowanie klasy wzorca poza pustymi metodami i jedną zmienną.

_conn = mysql_connect($conf['host'], $conf['user'], $conf['pass']) or die($this->error());
    }

    public static function instance($conf=null) {
        if (is_null(self::$_instance)) {
            self::$_instance = new DB($conf);
        }
        return self::$_instance;
    }
}
?>

Klasa DB zaprezentowana powyżej nie jest skomplikowana. Zawiera jednak tylko niezbędne metody, prezentujące działanie klasy. Niemożliwe jest stworzenie egzemplarza klasy DB, ponieważ konstruktor jest prywatny. Dostęp do obiektu możliwy jest poprzez publiczną, statyczną metodę instance().

Podsumowanie

Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie. Próba pobrania obiektu klasy DB powinna zwrócić ten sam zasób.

Poniższy wydruk pokazuje, że dokładnie tak się dzieje.

DB Object
(
    [_conn:private] => Resource id #11 
)
DB Object
(
    [_conn:private] => Resource id #11 
)

Wzorzec projektowy Singleton stosuje się bez względu na stopień skomplikowania aplikacji. Rozwiązanie to jest wygodniejsze i elastyczniejsze niż przechowywanie uchwytu do bazy danych w zmiennej globalnej.

5 odpowiedzi na “Wzorzec projektowy Singleton”

Jak najbardziej prawidłowe jest dziedziczenie klasy bazy danych po klasie ogólnej wzorca. Przykład pokazuje jednak tylko podstawową wersję. Mimo tego rozszerzyłem wpis o kod klasy Singleton. Boje się tylko, że w tej chwili to sztuka dla sztuki.

Mi się wydaje, że wszystkie dzieci tego singletona będą współdzieliły ten static $_instance . W wyniku tego nie będzie można stworzyć więcej singletonów. Nie sprawdziłem dokładnie, ale chyba tak będzie jak piszę

Możliwość komentowania została wyłączona.