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

  • 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?


  • #2
    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?

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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.
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          Wie könnte ich hier am besten vorgehen?
          Warum unterscheiden?
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design before you start to write code!
          2. Discuss and review it together with experts!
          3. Choose good tools (-> Adventure PHP Framework (APF))!
          4. Write clean and reusable software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            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.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              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.

              Kommentar


              • #8
                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

                Kommentar


                • #9
                  Wobei das mit dem UNION so nicht ganz klappt, die Spaltentypen dürfen sich nicht unterscheiden und auch die Anzahl muss dieselbe sein.
                  "Mein Name ist Lohse, ich kaufe hier ein."

                  Kommentar


                  • #10
                    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

                    Kommentar


                    • #11
                      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?
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design before you start to write code!
                      2. Discuss and review it together with experts!
                      3. Choose good tools (-> Adventure PHP Framework (APF))!
                      4. Write clean and reusable software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #12
                        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

                        Kommentar


                        • #13
                          Und warum realisierst du das nicht über generische Attribute oder einfach Richtext?
                          Viele Grüße,
                          Dr.E.

                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          1. Think about software design before you start to write code!
                          2. Discuss and review it together with experts!
                          3. Choose good tools (-> Adventure PHP Framework (APF))!
                          4. Write clean and reusable software only!
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                          Kommentar


                          • #14
                            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?

                            Kommentar


                            • #15
                              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.
                              Viele Grüße,
                              Dr.E.

                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                              1. Think about software design before you start to write code!
                              2. Discuss and review it together with experts!
                              3. Choose good tools (-> Adventure PHP Framework (APF))!
                              4. Write clean and reusable software only!
                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                              Kommentar

                              Lädt...
                              X