Was is eine factory class?



  • Hey CStoll,

    du bist zum Moderator aufgestiegen?

    Glückwunsch...



  • achso, dachte das UnknownClassName ist eine eigene Exception

    also einfachso die funktionen dann aufrufen geht nicht?!

    wie meinst das hier mit den virtuellen funktionen?Kannst mir da kurz ein beispiel geben?



  • wie heisst diese factory? objectfactory od. classfactory?



  • Was mir gerade auffällt...

    Wirfts du immer Referenzen und keine Zeiger, CStoll?
    Hat das einen Vorteil?



  • netrobot schrieb:

    wie heisst diese factory? objectfactory od. classfactory?

    deine frage verwirrt mich etwas!
    was ist der unterschied?
    btw was is eine classfactory?



  • ist es nicht besser, dass man vor einer factoryClass noch ein Interface bauen?
    also die beiden interface kommunizieren miteinander.



  • deine frage verwirrt mich etwas!
    was ist der unterschied?
    btw was is eine classfactory?

    ich habe irgendwo gelesen, es gibt 2 factories



  • netrobot schrieb:

    ist es nicht besser, dass man vor einer factoryClass noch ein Interface bauen?
    also die beiden interface kommunizieren miteinander.

    sorry, aber ich weis nicht was du mir grad damit sagen willst!
    wäre um eine erklärung dankbar!



  • class Factory
    {
    public:
    Base* createIt(const char* classname)
    {
    if(strcmp(classname,"First")==0)
    {
    b = new FirstMember();
    return b; //so in ordnung?
    }
    if(strcmp(classname,"Second")==0)
    {
    b = new SecondMember();
    return b;
    }
    else
    throw UnknownClassName(classname); //wie kann ich das verarbeiten??
    }
    private:
    Base* b; //das hier richtig? oder ist zeiger falsch?

    wozu braucht man hier Base* b?, muss man dieses Object intern verwalten?(zwischenspeichern)

    if(strcmp(classname,"Second")==0)
     {
        return new SecondMember();
     }
    

    Compiler wird nacher dieses noname Variable automatisch löschen



  • netrobot schrieb:

    deine frage verwirrt mich etwas!
    was ist der unterschied?
    btw was is eine classfactory?

    ich habe irgendwo gelesen, es gibt 2 factories

    Es gibt viel mehr als zwei Factory-Typen. Du meinst wahrscheinlich, neben der hier präsentierten Factory-Variante (die meistens als Object-Factory bezeichnet wird), eine Abstract Factory, so wie sie durch das GoF-Pattern Abstract Factory beschrieben wird. Abstract deshalb, weil du hier zwei Hierarchien hast: Eine Hierarchie von zu erzeugenden Objekten und eine Factory-Hierarchie. Die verschiedenen konkreten Factories erzeugen dann verschiedene Member der Objekt-Hierarchie.
    Eine google-Suche nach Abstract Factory sollte dir viele nützliche Informationen liefern.



  • CStoll-Gratulant schrieb:

    Wirfts du immer Referenzen und keine Zeiger, CStoll?
    Hat das einen Vorteil?

    Ich werfe - wenn überhaupt - Objekte, da brauche ich mich nicht um die Beseitigung kümmern. Und fange sie dann als Referenz, das spart erstens Konstruktor-Aufrufe und nutzt zweitens die Polymorphie der Exception-Klassen aus (Stichwort: virtuelle Funktionen).

    @Assambler: Virtuelle Methoden werden von der Basisklasse definiert (evt. sogar nur die Schnittstelle - dann sind es pur virtuelle Methoden) und von abgeleiteten Klassen neu deklariert. Welche Methode letzlich aufgerufen wird, hängt dann vom (dynamischen) Typ des Objekts ab:

    class Base
    {
    public:
      virtual void ShowIt() { cout<<"Base Object"<<endl; }
    };
    
    class Derived
    {
    public:
      void ShowIt() { cout<<"Derived Object"<<endl; }
    };
    
    int main()
    {
      Base* b=new Derived();
      b->ShowIt();
      delete b;
      return 0;
    }
    


  • [quote]
    Ich werfe - wenn überhaupt - Objekte, da brauche ich mich nicht um die Beseitigung kümmern. Und fange sie dann als Referenz, das spart erstens Konstruktor-Aufrufe
    [quote]
    spart Ctor weil es ist eine Referenz oder muss man erst const Referenz benutzen?



  • netrobot schrieb:

    spart Ctor weil es ist eine Referenz oder muss man erst const Referenz benutzen?

    Weil es eine Referenz ist 😉 (throw legt ein Objekt an, catch() bekommt entweder eine Kopie (wenn du per Wert fängst) oder einen Verweis (wenn du per Referenz fängst) von diesem Objekt übergeben)



  • muss man nicht trotzdem const & benutzen? damit man keine Modification mit dem eingeworfenden Object durchführen kann



  • Muß man nicht - vielleicht WILL man ja das übergebene Objekt verändern 😉 (außerdem - solange du das Exception-Objekt nicht weiterwirfst, wird es am Ende des catch-Blocks sowieso zerstört)


Anmelden zum Antworten