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”
Ładniej by było dziedziczyć po klasie z singletonem.
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ę
Wow this is a great resource.. I’m enjoying it.. good article
[…] moją uwagę przykuły na pierwszy rzut oka komentarze prawidłowe, bo co złego jest w komentarzu takim lub […]