Wzorzec projektowy Fabryka w PHP 8.4
Standard Fabryka (Factory) to wzorzec kreacyjny służący do tworzenia obiektów w kontrolowany sposób. Zapewnia, że obiekty są zawsze tworzone poprawnie, z odpowiednimi ustawieniami i konfiguracją.
Dlaczego wzorzec Fabryka jest ważny?
- Centralizuje logikę tworzenia obiektów w jednym miejscu,
- Umożliwia łatwą zmianę sposobu tworzenia obiektów bez modyfikacji kodu klienta,
- Ukrywa skomplikowaną logikę inicjalizacji przed użytkownikiem,
- Zapewnia spójność i poprawność twoorzonych instancji.
Kluczowe cechy wzorca Fabryka
- Hermetyzacja tworzenia - logika konstrukcji ukryta w metodach fabrycznych,
- Jasne nazewnictwo - metody opisują co tworzą (np. createSmtpMailer),
- Elastyczność - łatwa zmiana implementacji bez wpływu na kod klienta,
- Walidacja parametrów - fabryka może sprawdzać poprawność danych wejściowych.
Jak działa wzorzec Fabryka?
Wzorzec projektowy Fabryka (Factory) służy do tworzenia obiektów, których inicjalizacja może być skomplikowana lub zależna od wielu parametrów konfiguracyjnych. Świetnym przykładem zastosowania tego wzorca jest klasa MailerFactory z rozdziału 20 ebooka „Wysyłka maili", która udostępnia statyczne metody, takie jak createSmtpMailer() czy createMailHogMailer(). Dzięki temu programista nie musi ręcznie budować obiektu Mailer wraz z odpowiednim ciągiem DSN, lecz korzysta z gotowych, jasno nazwanych metod fabrycznych.
Zastosowanie fabryki zapewnia, że obiekty klasy Mailer są zawsze tworzone poprawnie, z odpowiednimi ustawieniami. To znacznie upraszcza proces integracji aplikacji z różnymi serwerami pocztowymi, np. SMTP czy MailHog. Dzięki fabryce kod staje się bardziej czytelny, mniej podatny na błędy i łatwiejszy w utrzymaniu – zmiana konfiguracji wysyłki maili sprowadza się do użycia innej metody fabrycznej, a nie ingerowania w główną logikę aplikacji.
<?php
declare(strict_types=1);
namespace DJWeb\Framework\Mail;
final class MailerFactory
{
public static function createSmtpMailer(
string $host,
int $port,
string $username,
string $password
): MailerContract {
$dsn = sprintf(
'smtp://%s:%s@%s:%d',
$username,
$password,
$host,
$port
);
return new Mailer($dsn);
}
public static function createMailHogMailer(
string $host = 'localhost',
int $port = 1025
): MailerContract {
$dsn = sprintf('smtp://%s:%d', $host, $port);
return new Mailer($dsn);
}
}
🎓 Chcesz poznać więcej wzorców projektowych?
Ten wpis to fragment kompleksowego kursu PHP 8.4, w którym szczegółowo omawiam wszystkie wzorce projektowe wraz z praktycznymi przykładami z rzeczywistych projektów.