Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zum Factory Design Pattern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • axelf
    antwortet
    Zitat von dr.e. Beitrag anzeigen
    Warum unterscheiden?
    Öhm, warum sollte ich nicht unterscheiden? Ich möchte ja von den beiden Klassen spezielle Daten zurückgeliefert bekommen.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Ich benutze dafür ein Verfahren dieser Art:

    PHP-Code:
    $oProductFactory = new ProductFactory;

    $oProductFactory->registerFactory (new ProductFactory_Navi);
    $oProductFactory->registerFactory (new ProductFactory_Handy);

    $aProducts $oProductFactory->create ($oDatabase $whereClause $orWhatever);



    class 
    ProductFactory
      
    {
      ...
      
    registerFactory (ConcreteProductFactory $oProductFactory)
        {
        
    $keys $oProductFactory->canHandle ();
        foreach ((array) 
    $keys as $key)
          {
          
    $this->aSubFactories[$key] = $oProductFactory;
          }
        }
      } 
    key repräsentiert dann bspw. ein Feld aus der Datenbank-Result-Menge, über das eine spezifische Fabrik angefordert werden kann.

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    Wie könnte ich hier am besten vorgehen?
    Warum unterscheiden?

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Hallo,

    was bekommst du denn an Daten für das Suchergebnis? Pro Treffer musst du doch irgendwie feststellen, welchen Typ der Treffer hat.

    PHP-Code:
    <?php
    $select 
    "
    SELECT *, 'Handy' AS deviceType FROM handys WHERE description LIKE '%
    $suche%'
    UNION
    SELECT *, 'Navi' AS deviceType FROM navis WHERE title LIKE '%
    $suche%'";
    // ..
    $products = array();
    while (
    $row mysql_fetch_assoc($result)) {
      
    $deviceType $row["deviceType"];
      
    $product ProductFactory::get($deviceType);
      
    $product->fromArray($row);
      
    $products[] = $product;
    }
    ?>
    Wenn du z.B. eine Handy- und eine Navi-Klasse hast, könnten beide von einer gemeinsamen Product-Klasse erben, die die Factory zur Verfügung stellt.

    PHP-Code:
    <?php
    abstract class Product {
      public static function 
    factory($deviceType) {
        
    $class __CLASS__ "_" $deviceType;
        if (
    class_exists($class)) {
          return new 
    $class();
        }
        throw new 
    InvalidArgumentException("invalid device type");
      }
      public function 
    fromArray(array $data) {
        foreach (
    $data as $key => $value) {
          if (
    property_exists($this$key)) {
            
    $this->{$key} = $value;
          }
        }
      }
    }
    class 
    Product_Handy extends Product {
      public 
    $description;
    }
    class 
    Product_Navi extends Product {
      public 
    $title;
    }
    ?>
    Der Einfachheit halber ohne Namensmapping (SQL -> PHP-Property) und ohne eigene Setter/Getter.

    Wäre zumindest mein Ansatz.

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Also z.B. über eine DB-Abfrage aus den Suchergebnissen den Typ ermitteln und dann jeweils die Klasse aufrufen?

    Was wäre denn ein bessere Design Konzept? Ich habe noch nicht so viel mit Design Pattern gemacht, daher bin ich mir nicht so sicher. Aber dachte das es für diesen Anwendungsfall ok ist.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Wenn du vorher prüfst welche Geräte alles auf der Suchergebnisse Seite angezeigt werden sollen -> Danach die entsprechenden Klassen nachladen!?

    Ansonsten bist du dir sicher das du das korrekte Design Konzept rausgesucht hast?

    Einen Kommentar schreiben:

Lädt...
X