3 Stimmen

Implementierung von Fabrikmethoden - C++

Ich habe den folgenden Code für die Implementierung des Entwurfsmusters "Fabrik".

class Pen{
public:
     virtual void Draw() = 0;
};

class RedPen : public Pen{
public:
     virtual void Draw(){
         cout << "Drawing with red pen" << endl;
     }
};

class BluePen : public Pen{
public:
     virtual void Draw(){
         cout << "Drawing with blue pen" << endl;
     }
};

auto_ptr<Pen> createPen(const std::string color){
     if(color == "red")
         return auto_ptr<Pen>(new RedPen);
     else if(color == "blue")
         return auto_ptr<Pen>(new BluePen);
}

Aber ich habe gehört, dass man das besser mit "C++-Vorlagen" machen kann. Kann jemand helfen, wie es getan wird und wie Vorlage Ansatz ist besser als diese?

Irgendwelche Gedanken

0voto

gnud Punkte 75549

Als Ergänzung zu meiner anderen Antwort, nur um das Factory-Muster vs. die Verwendung von Vorlagen zu diskutieren:

Der wichtigste (und einfachste) Grund für die Verwendung von Vorlagen ist, dass Ihr Code in jedem Fall identisch ist, abgesehen von den Datentypen, mit denen er arbeitet. Ein Beispiel hierfür sind die STL-Container. Es wäre möglich, eine Fabrikfunktion createVector("string") zu schreiben und jeden Container manuell einzugeben - aber das ist eindeutig suboptimal.

Auch wenn sich der Code und nicht nur die Datentypen unterscheiden, ist es möglich, Vorlagenspezialisierungen zu verwenden - in vielen Fällen wäre jedoch eine Fabrikfunktion sinnvoller.

Nehmen wir als Beispiel eine Datenbankabstraktionsbibliothek. Es wäre möglich, Template-Spezialisierungen zu verwenden, so dass die Bibliothek wie "db::driver" verwendet werden könnte. Aber das würde Sie dazu zwingen, den Datenbanktyp überall im Code anzugeben (was die Bibliothek von vornherein ziemlich nutzlos macht...), oder einen Fall zu einer Schnittstellenklasse vom Typ db::driver durchzuführen.

In diesem Beispiel ist es intuitiver, db::get_driver(odbc) zu sagen und die richtige Klasse zurückzubekommen, die an den Schnittstellentyp angepasst ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X