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
    hat ein Thema erstellt Frage zum Factory Design Pattern.

    Frage zum Factory Design Pattern

    Hi,

    für verschiedene Produkte gibt es bei mir je eine Klasse für ein Produkt.
    In der Factory hole ich mir je nach Produkttyp die entsprechende Klasse

    PHP-Code:
    $navi ProductFactory::get('navi'// Navigationsgeräte
    oder
    $handy 
    ProductFactory::get('handy'// Handys 
    Auf diesen Seiten weiß ich auch, welchen Typ ich benötige.

    Auf der Suchergebnisseite sollen aber Produkte beider Typen angezeigt werden und ich weiß ja vorher nicht ob es ein Handy oder Navi ist.
    Es sollen als kleine Beschreibung dann jeweils spezifische Daten zu jedem Produkttyp ausgegeben werden. Wie könnte ich hier am besten vorgehen?

  • nikosch
    antwortet
    Dann kannst Du eigentlich auch kein gemeinsames Interface verwenden. Vielleicht eher sowas wie ein Key-Value-Store für generische Attribute.

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Zitat von nikosch Beitrag anzeigen
    Ich würde zwei Fabriken, also das Abstract Factory pattern verwenden.
    Aber ich muss ja trotzdem den Typ auswerten, um zu wissen, welche Methode ich aufrufen kann. Es gibt z.B. bei den Navis keine Methode getKamera()

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    aber ich kann ja nun die statische Methode findById nicht aufrufen
    Dann solltest Du überlegen, warum sie statisch ist.
    Wenn in den Suchergebnissen Handys und Navis enthalten sind, dann hat ja das Navi andere Methoden als das Handy. Ist es dann ok, wenn man die Methoden so aufruft:
    Ich würde zwei Fabriken, also das Abstract Factory pattern verwenden.

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Hallo,

    ich möchte anhand des Beispiels hier...

    PHP-Code:
    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;
      public static function 
    findById($id){}
    }
    class 
    Product_Navi extends Product {
      public 
    $title;
    }

    $product Product::factory('Handy'); 
    ... alle Daten eines Handys erhalten. Über die Factory bekomme ich das jeweilige Objekt, aber ich kann ja nun die statische Methode findById nicht aufrufen. Wie komme ich an alle Daten nun ran?

    Noch eine andere Frage:
    Wenn in den Suchergebnissen Handys und Navis enthalten sind, dann hat ja das Navi andere Methoden als das Handy. Ist es dann ok, wenn man die Methoden so aufruft:
    PHP-Code:
    switch($type){
      case 
    'Handy':
        
    $product->getDescription();
      break;

      case 
    'Navi':
        
    $product->getTitle();
      break;

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    Der Vorteil zur Vererbung ist, dass du um ein neues Attribut einzuführen deine Factory nicht erweitern musst und ebenso kein neues Objekt implementiert werden muss.

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    jetzt muss ich nochmal nachfragen:
    welchen Vorteil hat die Attributklasse?

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    Es geht nicht um "schlimm", sondern darum zu diskutieren, ob hier Vererbung die richtige Wahl darstellt.

    Zu meiner Frage: zunächst musst dir überlegen, ob die Unterschiede tatsächlich über eigene Felder abgebildet werden, die jeweils nichts mit dem anderen Objekt-Typen zu tun haben. Deine Problemstellung ließe sich auch einfach dadurch lösen, dass du ein Feld vorsiehst, in dem die erweiterten Informationen untergebracht sind. Sofern es trotzdem semantische Felder sein sollen, wäre vielleicht ein Customizing-Konzept zu diskutieren. Du könntest die Attribute als generisches Set von Attribute-Objekten halten und alle Standard-Attribute durch explizite Methoden repräsentieren:

    PHP-Code:
    class Attribute {

        public function 
    __construct($name$value){...}

        public function 
    getName(){ return $this->name; }

        public function 
    getValue(){ return $this->value; }
    }

    class 
    Product {

       public function 
    getFoo(){
          return 
    $this->getAttribute('Foo')->getValue();
       }

       public function 
    getAttribute($name){...}


    Alle weiteren Produkte kannst du dann sehr einfach abfackeln, in dem du das Mapping der Datenbank-Inhalte anpasst und nicht keine Vererbung einziehen musst.

    Deshalb frage ich auch so genau nach.

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Leider kann ich mit der Frage nicht so viel anfangen. Wie meinst du das bzw. vielleicht versteh ich es an einem Beispiel besser was du meinst. Was ist eigentlich so schlimm an dem Beispiel von Chriz?

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    Und warum realisierst du das nicht über generische Attribute oder einfach Richtext?

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Zitat von dr.e. Beitrag anzeigen
    Welche Unterschiede sind das?
    z.B. für Navis möchte ich angeben was für Kartenmaterial vorhanden ist oder ob es eine 3D Ansicht vom Gelände gibt. Für Handys z.B. wie viel Megapixel die Kamera hat

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Ich habe mir eine Tabelle gemacht, wo so allgemeine Daten drinstehen und dann speziell eine Tabelle für die einzelnen Produkte (Fremdschlüssel). In der allgemeinen Tabelle gibt es die Spalte typ, und diese wird ausgelesen

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Wobei das mit dem UNION so nicht ganz klappt, die Spaltentypen dürfen sich nicht unterscheiden und auch die Anzahl muss dieselbe sein.

    Einen Kommentar schreiben:


  • axelf
    antwortet
    Hi Chriz,

    Zitat von Chriz Beitrag anzeigen
    Hallo,

    was bekommst du denn an Daten für das Suchergebnis? Pro Treffer musst du doch irgendwie feststellen, welchen Typ der Treffer hat.
    Die Daten zum Suchergebnis bekomme ich über eine Abfrage. Hatte es nicht so gut gelöst wie in deinem Beispiel, aber danke für den hilfreichen Beitrag. Das hat mir sehr weitergeholfen. Die abstrakte Klasse Produkt hatte ich auch angelegt und Handy bzw. Navi werden dann abgeleitet.

    Ich hatte noch eine Factory-Klasse angelegt, aber finde deine Möglichkeit auch gut. Nochmals viele Dank. Wieder was dazugelernt

    Einen Kommentar schreiben:

Lädt...
X