2016-07-20 9 views
0

ich die folgenden Codes geben zu übernehmen, meine Frage zu veranschaulichen:Mit Factory-Methode verschiedene Klassen (C++)

class Basic 
{ 
    public: 
     Basic(); 
     ~Basic(); 
}; 

class ExtendA: public Basic 
{ 
    public: 
     class Para 
     { 
     }; 
     Para para_; 

}; 
class ExtendB: public Basic 
{ 
    public: 
    class Para 
    { 

    }; 
    Para para_; 
}; 

enum Method 
{ 
    MedExtendA, 
    MedExtendB, 
    MedExtendAVar1, 
    MedExtendBVar1 
}; 

class Enginee 
{ 
public: 
    class Para() 
    { 
     public: 
     ExtendA::Para paraA_; 
     ExtendB::Para paraB_; 
    }; 
    Para paraEnginee_; 
    Enginee(Method med) 
    { 
     switch(med): 
     { 
      case MedExtendA: 
       pBasic.reset(new ExtendA()); 
       break; 
      case MedExtendAVar1: 
       pBasic.reset(new ExtendA()); 
       ExtendA *p = dynamic_cast<ExtendA *> (pBasic.get()); 
       p.para_ = ; // set the parameter 
       break; 
      case MedExtendB: 
       ... 
       break; 
      case MedExtendBVar1: 
        ... 
       break; 

     } 
    } 
    ~Enginee() 
    { 
     } 
    boost::shared_ptr<Basic> pBasic; 
}; 

Aus dem obigen Beispiel können wir sehen, dass Basic die Basisklasse ist während ExtendA und ExtendB ableiten Klasse basierend auf Basic Klasse. Die Klasse Enginee ist eine Factory-Klasse, die den Aufruf anderer Klassen erleichtert. Der Grund, warum Enginee Klasse benötigt wird, kann im folgenden Beispiel gezeigt:

Ohne Enginee Klasse:

ExtendA objA; 
objA.para_ /// parameter setting 
objA.do_something(); 

Mit Enginee Klasse:

Enginee myEngine(MedExtendAVar1); 
    myEngine.do_something(); 

Mit einem Wort, mit Factory-Methode zu konstruieren Eine Enginee Klasse gibt eine einheitliche Schnittstelle für die Verwendung ExtendA und ExtendB Klasse. Im obigen Beispiel können wir abhängig von der Parametereinstellung verschiedene Arten von Klassen erstellen, die sehr einfach aufgerufen werden können. Es macht jedoch auch die Codes komplizierter. Hier ist meine Frage: Gibt es andere alternative Lösungen? Was ist das Problem der vorgeschlagenen Lösung?

+1

Können Sie genauer sein als "verschiedene Klassen einbeziehen?" Was ist das Problem, das du lösen willst? Müssen Sie Klassen unterschiedlicher Typen instanziieren, die nur zur Laufzeit ermittelt werden? Oder verkapseln Sie einfach grundlegenden Polymorphismus? –

+0

@TimStraubinger Danke. Ich habe den Namen des Titels neu geschrieben. Die Hauptfrage ist, welche Art von Problem der Verwendung der Factory-Design-Pattern-Methode, um verschiedene Klassen zu integrieren, wie im Beispiel gezeigt. – feelfree

+0

Ich glaube, [Abstract Factory] (https://sourcemaking.com/design_patterns/abstract_factory) ist besser zu Ihrem Problem als Factory-Methode. –

Antwort

3

Ist die Fabrikmethode die einzige Möglichkeit, verschiedene Klassen einzubauen?

Nr

Ich bin nicht ganz sicher, ob ich richtig verstehe Ihre Frage. Aber wenn ich das tue und Sie fragen, ob eine Factory-Klasse die einzige Möglichkeit ist, Ihre abgeleiteten Klassen zu instanziieren und einen Basisklasse-Zeiger auf sie zu bekommen, dann lautet die Antwort "Nein".

Sie könnten einfach Base* b = new ExtendA; tun.

Wenn ich Ihre Frage missverstanden habe, dann ignorieren Sie einfach meine Antwort, aber bitte versuchen Sie, die Frage zu klären.

+0

Danke, und ich habe den Titel meiner Frage genannt. Vielen Dank. – feelfree

Verwandte Themen