Wzorzec factory należy do wzorców konstrukcyjnych. Pozwala na tworzenie obiektów bez konieczności specyfikacji klas na podstawie której będą tworzone. Umożliwia on stworzenie osobnej metody odpowiedzialnej za tworzenie nowych obiektów.

Aby pokazać działanie wzorca factory posłużę się prostym przykładem. Załóżmy, że mam kontroler, który w zależności od typu przekazanego pliku musi stworzyć nowy obiekt widoku i wywołać w nim metodę generującą widok. Zacznę od stworzenia interfejsu IView dla widoków:

PHP:
  1. interface IView
  2. {
  3.     function render();
  4. }

Następnie tworzę klasy dla widoków implementujące interfejs IView:

PHP:
  1. class HtmlView implements IView
  2. {
  3.     function render()
  4.     {
  5.         // generowanie widoku html
  6.         // [...]
  7.     }
  8. }
  9.  
  10. class XmlView implements IView
  11. {
  12.     function render()
  13.     {
  14.         // generowanie widoku xml
  15.         // [...]
  16.     }
  17. }

Pozostaje mi stworzenie klasy głównej:

PHP:
  1. class View
  2. {
  3.     static function factory($fileName)
  4.     {
  5.         switch(end(explode('.', $fileName)))
  6.         {
  7.             case 'html' :
  8.                 return new HtmlView();
  9.             case 'xml' :
  10.                 return new XmlView();
  11.             default :
  12.                 throw new Exception('Unknown file type');
  13.         }
  14.     }
  15. }

Metoda renderView() w zależności od rozszerzenia pliku przekazanego w parametrze zwraca obiekt odpowiedniej klasy. Na koniec pozostało jeszcze tylko uruchomienie metody renderView() klasy View:

PHP:
  1. $view = View::factory('index.html');
  2. $view->render();

Jak widać implementacja wzorca factory jest bardzo prosta i przydatna zarazem kiedy zachodzi potrzeba tworzenia obiektów bez specyfikacji klas.

Więcej o wzorcu factory:
http://pl.wikipedia.org/wiki/Wzorzec_metody_fabrykującej
http://www.fluffycat.com/PHP-Design-Patterns/Factory-Method
http://www.vincehuston.org/dp/factory_method.html
http://www.phppatterns.com/docs/design/the_factory_method

Leave a Reply

You must be logged in to post a comment.