Frage

Lassen Sie uns sagen, ich habe eine Klasse wie folgt:

class MonkeyFish
{
   MonkeyFish( GlobalObjectA & a, GlobalObjectB & b, GlobalObjectC & c);

   private:
     GlobalObjectA & m_a;
     GlobalObjectB & m_b;
     GlobalObjectC & m_c;
}

Ohne eine Fabrik, ich brauche das folgende zu tun, um eine MonkeyFish zu instanziiert.

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFish * monkey_fish = new MonkeyFish(a, b, c);
  monkey_fish->go();
}

Auf der anderen Seite, wenn ich eine MonkeyFishFactory habe, wie es scheint, ich habe dies zu tun:

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFishFactory mf_factory(a, b, c);
  MonkeyFish * monkey_fish = mf_factory.buildMonkeyFish("Bob");
  monkey_fish->go();
}
  1. ich noch globale Objekte haben.

  2. Auch wenn die MonkeyFishFactory selbst die GlobalObjects intern erstellt (so sind sie nun in der MonkeyFishFactory statt wahr Globals), scheint es, wie die MonkeyFishFactory selbst nach wie vor ein globales Objekt sein muss, so dass ich es jederzeit zugreifen kann ich eine MonkeyFish erstellen möchten.

Ist nicht die Fabrik Muster der gleichen wie globaler Zustand in diesem Fall?

(ich zur Zeit arbeitet unter der Annahme, dass die globale Zustand eine schlechte Sache ist, und die Beseitigung der es eine gute Sache ist.)

War es hilfreich?

Lösung

Sind Sie verwirrende Begriffe hier?

Die Werksmuster wird in der Regel angewendet, wenn Sie eine Instanz einer konkreten Klasse zurückkehren, die sich hinter einer abstrakten Schnittstelle verbirgt. Die Idee ist, dass der Anrufer nur die Schnittstelle sieht und muss nicht einmal wissen, was die konkrete Art des Objekts ist. Es geht um eine Objektinstanz basierend auf Parameter, die Erstellung und Entkopplung die Logik im Zusammenhang mit der Entscheidung, was von dem Benutzer erstellen Objekt erstellen das Objekt aus.

Was Sie beschreiben, ist eine Mischung aus Singleton (oder MonoState) und Factory. Ihr Werk hat Zustand, so dass es nicht statisch gemacht werden kann. In diesem Fall müssen Sie so etwas wie das Singleton-Muster anzuwenden, um die Schaffung einer einzigen Fabrik Instanz gesteuert werden mit den entsprechenden Globals in ihm verborgen:

class IMonkeyFish {
public:
    virtual ~IMonkeyFish() = 0;
    virtual void go() = 0;
};

class Factory {
public:
    static Factory& instance();
    IMonkeyFish* createMonkeyFish();
protected:
    Factory(GlobalObjectA& a, GlobalObjectB& b, GlobalObjectC& c);
private:
    static Factory *theInstance;
    GlobalObjectA&  instanceOfA;
    GlobalObjectB&  instanceOfB;
    GlobalObjectC&  instanceOfC;
};

Factory& factory = Factory::instance();
IMonkeyFish* fishie = factory.createMonkeyFish();
fishie->go();

Das Singleton Muster regelt die Schaffung der Fabrik-Instanz. Das Factory Muster verbirgt die Details die Erstellung von Objekten umgeben, die den IMonkeyFish-Schnittstelle implementieren. Die gute Sache (TM) ist das Versteck des globalen Zustandes und Entkopplung der MonkeyFish konkreten Details von einer Instanz zu schaffen.

Die Verwendung oder Richtigkeit der Singleton Sachen zu verwenden, ist eine ganz andere Frage aber. Es gibt wahrscheinlich eine Reihe von Themen im Umlauf über das auch.

Andere Tipps

Globaler Zustand ist nicht in-und-von-selbst eine schlechte Sache. öffentliche globaler Zustand ist eine schlechte Sache. Die Fabrikmuster hilft globalen Zustand einzukapseln, das ist eine gute Sache.

Es gibt keinen globalen Zustand in der Fabrik. Es schafft nur Objekte. Da es nicht jeder Staat in der Fabrik. Es ist in Ordnung global zu sein.

Sie müssen keine globalen Objekte lassen. B | | C auf Nachfrage Affe Fischfabrik sollten diese GlobalOjectA erstellen. Mit dem Schalter oder wenn innerhalb Verfahren, um zu bestimmen, welcher.

Sie haben die Kontrolle über Erstellung von Objekten in einer Fabrik gekapselt. Sie möchten Ihre Instanziierung Details versteckt werden, nicht überall reproduziert Sie einen neuen MonkeyFish benötigen. Denken Sie über das Testen, Einzel Verantwortung, und das Gesetz des Demeter. Warum soll die Ihre Klasse will einen MonkeyFish verwenden muß, etwas über die Arbeit wissen, dass es einen bauen dauert. Was passiert, wenn Sie MonkeyFish testen? Wie würden Sie es tun, wenn Sie nicht das Schöpfung Details eingekapselt haben?

Der Job einer Factory-Klasse ist ein Objekt zu instanziiert und es zurück an den Aufrufer übergeben; nicht das globale instanzierte Objekt zu verwenden, um auszuwählen. So ist Ihr Werk Beispiel falsch. Es sollte sein:

int main()
{
  MonkeyFish * monkey_fish = MonkeyFishFactory::buildMonkeyFish("Bob");
  monkey_fish->go();
}

Beachten Sie, keine globalen Objekte und MonkeyFishFactory ist nicht instanziert.

Ich glaube, du die Singleton-Muster denkst, nicht die Fabrik-Muster. Im Singletonmuster haben Sie nur auf Instanz einer Klasse, die es im Grunde das Äquivalent eines globalen Objekts macht, außer es keine globale Variablen zugeordnet ist.

Sie sollten Ihre Einschränkungen und Anforderungen angeben, ob Sie eine gute Antwort erhalten möchten. Das Wichtigste, was eine gute Antwort zu erhalten ist, zu wissen, was Frage zu stellen.

In dem Code-Schnipsel Sie vorausgesetzt, Sie haben beschlossen, Globals zu verwenden, aber das hat nichts mit dem zu tun, ob Sie eine Fabrik oder nicht. Wenn Sie eine Fabrik verwenden, die auf diesem Globals noch abhängig ist, dann müssen Sie nur noch ein Stück Code mit dem Rest stapeln.

Versuchen Sie, klar zu sagen, was Sie erreichen wollen, und Sie werden wahrscheinlich eine bessere Antwort bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top