Poprzedni wpis dotyczył wzorca projektowego Singleton, który jest niezbędny w przypadku pojedynczych obiektów tego samego typu. Obecny tekst porusza problem tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas.
Fabryka abstrakcyjna
Plusem wykorzystania wzorca fabryki abstrakcyjnej jest możliwość ukrycia szczegółów implementacyjnych klas reprezentujących dany produkt. W ten sposób klient widzi tylko interfejs. Ukryte zostają również nazwy klas, co odizolowuje klienta od problemu określenia, do której klasy należy obiekt.
<?php
interface IUser {
function getName();
}
class User implements IUser {
public function __construct($id) { }
public function getName() {
return 'Jacek';
}
}
class UserFactory {
public static function create($id) {
return new User($id);
}
}
?>
Klasa User
zaprezentowana powyżej implementuje interfejs IUser
, który zawiera metodę getName()
. Tworzenie nowego obiektu użytkownika odbywa się poprzez statyczną metodę create()
. Szczegóły tworzenia użytkowników ukryte są w klasie User
fabryki.
Podsumowanie
Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie.
<?php
$oUser = UserFactory::create(1);
echo($oUser->getName());
?>
Poniższy wydruk pokazuje, że dokładnie tak się dzieje.
Jacek
Wzorzec projektowy fabryki abstrakcyjnej kładzie nacisk na tworzenie produktów z konkretnej rodziny.
W odpowiedzi na “Wzorzec projektowy Fabryka abstrakcyjna”
[…] Fabryka to jeden z popularniejszych wzorców projektowych. W sieci znajdziemy wiele możliwości implementacji i sposób jego wykorzystania. Operacje bazodanowe w aplikacjach internetowych to częste działanie, dlatego opracowanie uniwersalnej koncepcji zarządzania rekordami czy całymi kolekcjami danych jest przydatne. Taki scenariusz dobrze rozwiązuje właśnie wzorzec projektowy – Fabryka. […]