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.

Pozostaw Odpowiedź