Objekt Fabriken



  • Hallo zusammen,

    wenn ich die "Object Factories" richtig verstanden habe, kann ich mir mit ihrer Hilfe Objekte an Hand des Klassennamens, oder eine anderen eindeutigen Kennung erzeugen lassen.
    Der Factory muss nur die Kennung und der dazugehörige Datentyp bekannt sein und kann dann ein Objekt für mich erzeugen.
    Wichtig ist auch noch, das alle Datentypen eine gemeinsame Schnittstelle besitzen.
    Hoffentlich hab ich's bis jetzt richtig verstanden.

    Also, hier hab ich mal zwei Klassen:
    eine Basis Klasse und eine davon abgeleitete.

    class Base
    {
       public:
          virtual void start(void) = 0;
    }
    
    class Derived : public Base
    {
       public:
          // Implementiert die Methode der Basis Klasse
          virtual start(void);
    
          // Besitzt noch eine weitere Methode
          void setValue(int i);
    };
    

    Nun hab ich aber ein Verständnisproblem bei vollgendem Code:

    int main(void)
    {
       Basis *b = factory.createObject("Typkennung");
       b->start();
    }
    

    Meinem Programm ist's nun ziemlich egal, welche konkrete Klasse von der Factory geliefert wird, solange das Interface implementiert wird.
    Soweit ist's noch klar.
    Was mach ich aber mit sowas?

    int main(void)
    {
       Base *b = factory.createObject("Derived");
    
       // Das klappt nicht, da die Methode setValue kein Teil der Basisschnittstelle ist
       b->setValue(1);
    }
    

    Allerdings klappt das auch nicht

    int main(void)
    {
       Derived *b = factory.createObject("Derived");
    
       // Das klappt nicht, da die Methode createObject() der Factory nur den Basis Typ liefert 
       b->setValue(1);
    }
    

    Dann bliebe mir ja nur noch vollgendes:

    int main(void)
    {
       Derived *b = static_cast<Derived*>(factory.createObject("Derived"));
    
       // Jetzt klappt's
       b->setValue(1);
    }
    

    Hab ich die Verwendung der Factories wirklich verstanden?
    Es hat natürlich Vorteile, wenn die Objekte nicht in meinem Programme direkt, sondern zentral angelegt werden.
    Allerdings lege ich micht mit dem static_cast doch auf einen Typ fest, oder nicht?

    Vielleicht kann mir ja einer von euch einen Tipp für die Verwendung von Factories geben.
    Danke



  • Hallo

    Das klappt nicht, da die Methode setValue kein Teil der Basisschnittstelle ist

    Das ist das Problem. Das ganze Schnittstelle-Factory-Prinzip macht nur Sinn, wenn die Schnittstelle komplett ausreicht, um alle notwendigen Funktionen von außen über die Schnittstelle aufzurufen.

    casten hingegen ist keine Lösuzng, weil sie alle Vorteile der Schnittstelle wieder zunichte macht.

    bis bald
    akari



  • Wirklich ärgerlich.
    Damit ist dieses Pattern leidern nicht für mich geeignet.
    Aber danke für die Antwort.

    Bis denne


Anmelden zum Antworten