Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy to jeszcze jest Fabryka?
Forum PHP.pl > Forum > PHP > Object-oriented programming
djgrin
Cześć wszystkim,
krótko mówiąc - miałem kod oparty o wzorzec fabryki i po licznych zmianach ewoluował on do czegoś takiego:
  1. class TheFactory {
  2. // ...
  3.  
  4. public function theFactoryMethod($what) {
  5. switch($what) {
  6. case 'one': return new ClassA();
  7. break;
  8. case 'two': return new ClassB();
  9. break;
  10. case 'three': return new ClassC();
  11. break;
  12.  
  13. // ...
  14. }
  15. }
  16.  
  17. // ...
  18. }
  19.  
  20. class TheClass extends TheFactory {
  21. // ...
  22. }
  23.  
  24. $obj = new TheClass();
  25. $newObj = $obj->theFactoryMethod('one');


Chodzi o to, że metoda produkująca obiekty przestała być statyczna, a ja wywołuję ją z obiektu. Klasy ClassA, B i C implementują oczywiście wspólny interfejs, pominąłem tutaj wiele szczegółów, żeby nie zaciemniać, ale mam nadzieję, że wiecie, o co chodzi...
I moje pytanie: czy to jeszcze opiera się o koncepcję Fabryki, czy już nie? Jak sądzicie?

Być może pytanie jest czysto teoretyczne (bo kod oczywiście działa), ale może pokażecie mi błędy, których ja już nie zauważam winksmiley.jpg...
Tak czy siak - liczę na opinie i dyskusję.

Pozdro
-=Peter=-
Jest to nadal metoda fabryczna, jednak jaki masz cel w tym aby ta metoda była nie statyczna? O to chodzi w tym wzorcu aby utworzyć obiekt klasy wyspecjalizowanej wywołując metodę statyczną klasy bazowej, po to aby nie tworzyć obiektu w celu utworzenia obiektu właściwego ;]

Cytat
robiąc to statycznie na pewno działało by to szybciej. Wywołanie statycznej funkcji działa około 2 razy szybciej. Tak mi się o uszy obiło.

A nie obiło ci się o uszy, że nie powinno się rozpowszechniać "faktów"? Przed napisaniem takiej bzdury lepiej uruchom prostego benchmarka (10 linijek kodu) i sprawdź, czy to prawda.
jaslanin
Oni wszyscy kłamią?

http://www.google.pl/#hl=pl&source=hp&...708fd10123afbf1
-=Peter=-
Powiem tyle, że strzeliłeś sobie w kolano winksmiley.jpg Przeczytaj głębiej np. wpis w pierwszym wyniku w google w linku który podałeś...

Być może było to kiedyś prawdą, być może odnosi się to do wywołania metody niestatycznej (obiektowej) w sposób statyczny - wtedy faktycznie widać różnicę że wywołanie statyczne metody obiektowej jest wolniejsze od wywołania na obiekcie i wtedy taką metodę należy zamienić na statyczną - wzrost wydajności o ok 1/4.
djgrin
Cytat(-=Peter=- @ 28.05.2010, 21:20:17 ) *
jaki masz cel w tym aby ta metoda była nie statyczna?


Chodzi o to, że obiekt już i tak istnieje (kontynuując przykład, chodzi o obiekt klasy TheClass). A dodatkowo w metodzie fabryki ustawiane są pewne parametry zwracanego obiektu, które bazują na atrybutach właśnie obiektu TheClass (mówiąc w dużym skrócie). Stąd to niestatyczne wywołanie.
Czy to ma sens smile.gif?

Bo wolałem zrobić tak, niż np.:
  1. TheClass::theFactoryMethod($obj, 'one');

(czyli gdyby metoda była statyczna).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.