Fabryka jest bardzo popularnym kreacyjnym wzorcem projektowania aplikacji. W tym wzorcu klasa odpowiada, za tworzenie obiektu, który chcesz użyć. Wyobraźmy sobie to na przykładzie fabryki samochodów. Jesteśmy sprzedawcą i składamy zamówienie na Mercedesa klasy C i taka fabryka nam wyprodukuje taki samochód.

Prześledźmy poniższy kod obrazujący powyżej opisane przeze mnie zdarzenie.

<?php

    interface Pojazd
    {
        public function zwrocNazweIMarke();
    }

    abstract class Samochod implements Pojazd
    {
	   protected $marka;
	   protected $model;

	   public function zwrocNazweIMarke()
	   {
	      return $this->marka.' '.$this->model.'<br>';
	   }
	   public abstract function jedz();
   }

   class Mercedes extends Samochod
   {
	   public function __construct($model)
	   {
	     $this->marka = "Mercedes";
		 $this->model = $model;
	   }

	   public function jedz()
	   {
	      echo "jadę $this->marka $this->model bruuuum brum...<br>";
	   }
    }

    class Audi extends Samochod
    {
	   public function __construct($model)
	   {
	     $this->marka = "Audi";
		 $this->model = $model;
	   }

	   public function jedz()
	   {
	      echo "jadę $this->marka $this->model audi rządzi. brum brum...<br>";
	   }
    }

    class FabrykaSamochodow
    {
	   public static function stworzMercedesa($model)
	   {
	       return new Mercedes($model);
	   }

	   public static function stworzAudi($model)
	   {
	       return new Audi($model);
	   }
    }

//demonstracja dzialania

$audi = FabrykaSamochodow::stworzAudi('A8');
$merc = FabrykaSamochodow::stworzMercedesa('C-120');

$audi->jedz();
$merc->jedz(); 
?>

Dzięki Fabryce mamy większą kontrole nad tworzeniem obiektów i programista nie musi znać szczegółów implementacyjnych tworzenia obiektów klasy. Gdy rozbudujemy wzorzec o tak zwaną abstrakcyjną fabrykę wtedy mamy możliwość całkowitego ukrycia implementacji obiektów przed klientem.  Klient widzi tylko interfejs i nie ma możliwości zajrzenia do kodu oraz to, że wymuszana jest spójność produktów.

Gorąco zachęcam do stosowania wzorców programistycznych gdyż ułatwiają one rozwiązywanie problemów, które kiedyś na pewno Ci się zdarzą, a lepiej jest stosować już przemyślane rozwiązania niż samemu wymyślać nowe.

Działający kod