Napisany gru-13-2008
simple factory
Ponowne spotkanie z tematyką wzorców projektowych. Tym razem przyjrzymy się prostej fabryce. Nie jest to co prawda pełnoprawny design pattern, aczkolwiek w praktyce okazuje się bardzo przydatny. Pozwala bowiem na hermetyzację procesu tworzenia obiektów różnych klas. Prześledzimy to na przykładzie, gdyż w ten sposób najszybciej zrozumiecie o co w tym wszystkim chodzi. Załóżmy, że nasza aplikacja będzie mogła działać w oparciu o różne typy baz danych: PostreSQL lub MySQL. Pierwszą rzeczą jaką robimy to piszemy sobie klasy do ich obsługi. Aby można było z nich wymiennie korzystać tworzymy wspólny interfejs:
UWAGA! Model uproszczony i nierealny! Ma tylko pomóc w zrozumieniu zagadnienia!
interface DatabaseInterface {
public function See();
}
Kolejnym krokiem jest napisanie klas MySQLDB i PostgreSQLDB:
class MySQLDB implements DatabaseInterface {
public function See () {
echo "MYSQL";
}
}
class PostgreSQLDB implements DatabaseInterface {
public function See () {
echo "POSTGRESQL";
}
}
Pozostaje hermetyzacja tworzenia obiektów w klasie SimpleFactory:
class SimpleFactory {
public function DatabaseConnection ($type) {
switch ($type) {
case 'MYSQL': return new MySQLDB();
case 'POSTRESQL': return new PostgreSQLDB();
}
}
}
Obiekt SimpleFactory dołączamy do klasy obsługującej połączenia z bazą danych:
class DBConnection {
private $factory;
public function __construct (SimpleFactory $obj) {
$this->factory = $obj;
}
public function setType ($type) {
$connection = $this->factory->DatabaseConnection($type);
$connection->See();
}
}
Jakie są zalety takiego rozwiązania? Łatwość w wyborze rodzaju bazy danych używanej przez aplikację. W praktyce wygląda to tak:
$fac = new DBConnection(new SimpleFactory());
$fac->setType('MYSQL');
// zmieniamy tylko w jednym miejscu by
// przelaczyc sie na postgreSQL!
// a to dlatego ze kazdy rodzaj obiektu tworzonego
// prze fabryke ma zaimplementowana ta sama
// funkcjonalnosc narzucona poprzez interfejs!
Oczywiście metoda DatabaseConnection w klasie SimpleFactory może być oznaczona jako static. Wówczas nie musimy tworzyć instancji ów klasy. Dla zainteresowanych polecam wzorce: metoda fabrykująca i fabryka abstrakcyjna.
