Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prośba o wytłumaczenie dwóch wzorców projektowych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jarod
Nie mogę znaleźć w miarę sensownego i po polsku (ang w ostateczności) porównania wzorca Abstract Factory i Factory Method

Możecie mi to wytłumaczyć na przykładzie albo jakieś linki po polsku?

pozdrawiam
Ociu
http://en.wikipedia.org/wiki/Abstract_factory_pattern
http://en.wikipedia.org/wiki/Factory_method


Po ang. popatrz na przykłady a powinno Ci to wystarczyć.
Strzałek
http://phpedia.pl/wiki.php?title=Factory_Method
Jarod
Czyli to jest Factory Method:
  1. <?php
  2. class DatabaseFactory
  3. {
  4. private function __construct(){}
  5.  
  6. public static function getInstance()
  7. {
  8. require_once('Core/Cube/Database/' . Config::$DbType . '/' . Config::$DbType . '.class.php');
  9.  
  10. return new Config::$DbType();
  11. }
  12. }
  13. ?>



a to Abstract Factory:
  1. <?php
  2. abstract class DatabaseFactory
  3. {
  4. public static function getInstance()
  5. {
  6. require_once('Core/Cube/Database/' . Config::$DbType . '/' . Config::$DbType . '.class.php');
  7.  
  8. return new Config::$DbType();
  9. }
  10. }
  11. ?>


?
SongoQ
@J4r0d A raczyles zobaczyc na linki ktore dostales?
Jarod
Cytat(SongoQ @ 1.03.2007, 10:45:59 ) *
@J4r0d A raczyles zobaczyc na linki ktore dostales?

Tak.
Helios
Odkopuje bo nie chce zakladac nowego temtu. Chce zrozumiec dokladnie te 2 wzorce i bylbym wdzieczny jakby ktos rzucil okiem na to i zweryfikowal czy dobrze je pojmuje. Na wiki jest tylko Factory Method, ale w moim przekonaniu jest tam blad w kodzie: http://phpedia.pl/wiki.php?title=Factory_Method
poniewaz funkcja getRenderer nie zwraca nic, a powinna zwrocic wybrany obiekt. Opis Abstract Factory wogole nie istnieje, dlatego prosze Was o pomoc. Jak kod bedzie poprawny to i komus jeszcze sie przyda.

Factory Method:
  1. <?php
  2.  
  3. interface Render {
  4. abstract function render();
  5. }
  6.  
  7. class HTMLView implements Render {
  8. public function render(){
  9. print "To jest widok HTMLView.";
  10. }
  11. }
  12.  
  13. class PDFView implements Render {
  14. public function render(){
  15. print "To jest widok PDFView.";
  16. }
  17. }
  18.  
  19. class NewsFactory {
  20.  
  21. static public function getView($view){
  22. switch($view){
  23. case 'HTML':
  24. return new HTMLView;
  25. break;
  26.  
  27. case 'PDF':
  28. return new PDFView;
  29. break;
  30.  
  31. default:
  32. throw new Exception('Brak modulu widoku.');
  33. break;
  34. }
  35. }
  36.  
  37. }
  38.  
  39. try{
  40. $oView = NewsFactory::getView('PDF');
  41. }catch(Exception $exception){
  42. die($exception->getMessage());
  43. }
  44. $oView->render();
  45.  
  46. ?>


Abstract Factory:

  1. <?php
  2.  
  3. abstract class NewLine {
  4. abstract public function getNl();
  5. }
  6.  
  7. abstract class SystemManager {
  8. abstract public function getNlSystem();
  9. }
  10.  
  11. class WinNl extends NewLine {
  12. public function getNl(){
  13. return "r\n";
  14. }
  15. }
  16.  
  17. class UnixNl extends NewLine {
  18. public function getNl(){
  19. return "\n";
  20. }
  21. }
  22.  
  23.  
  24. class WinManager extends SystemManager {
  25. public function getNlSystem(){
  26. return new WinNl;
  27. }
  28. }
  29.  
  30. class UnixManager extends SystemManager {
  31. public function getNlSystem(){
  32. return new UnixNl;
  33. }
  34. }
  35.  
  36. $oSystemManager = new UnixManager;
  37. $oNlSystem = $oSystemManager->getNlSystem();
  38. print 'To jest test Abstract Factory'.$oNlSystem->getNl();
  39.  
  40. ?>
Sedziwoj
jest :
  1. <?php
  2. class DB_Abstraction_AbstractFactory implements iAbstractFactory {
  3.  
  4. private function __construct() {
  5.  
  6. }
  7. }
  8. ?>

a potem:
  1. <?php
  2. $abstractfactory = new DB_Abstraction_AbstractFactory();
  3. ?>


Czy ktokolwiek sprawdza poprawność tych skryptów?
Strzałek
Możliwe że wystąpiła pomyłka. Nie o to chodzi. Chodzi o to żebyś "przeczytał" kod i zrozumiał idee, oraz założenia.
Ja pisząc na wiki o Factory Method też pisałem kod "z palca". On ma tylko przedstawić Ci obrazowo wzorzeć

PS: Mój kod chyba jednak działa dobrze winksmiley.jpg
Sedziwoj
Cytat(Strzałek @ 26.08.2007, 22:53:46 ) *
Możliwe że wystąpiła pomyłka. Nie o to chodzi. Chodzi o to żebyś "przeczytał" kod i zrozumiał idee, oraz założenia.
Ja pisząc na wiki o Factory Method też pisałem kod "z palca". On ma tylko przedstawić Ci obrazowo wzorzeć


Tylko że jak ktoś nie zna idei, to nie wie czy to co jest wynika z błędu, czy może tak powinno być. Przykłady powinny być proste, ale najważniejsze aby działały, bo błąd może maskować rzeczywiste działanie wzorca.

Przecież obiektu fabryki się nie tworzy, to rozwala założenia (no chyba że jako singletona? ale to bez sensu)
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.