Verwenden abstrakte Fabriken "neu"?

8

Ich versuche Dependency Injection so viel wie möglich zu verwenden, aber ich habe Probleme, wenn es um Dinge wie kurzlebige Abhängigkeiten geht.

Nehmen wir zum Beispiel an, ich habe ein Blog-Manager-Objekt, das eine Liste von Blogs erstellen möchte, die es in der Datenbank gefunden hat. Die Optionen dafür (so weit ich das beurteilen kann) sind:

  1. neuer Blog ();
  2. $ this- & gt; loader- & gt; blog ();
    • Das Loader-Objekt erstellt verschiedene andere Arten von Objekten wie Datenbankobjekte, Textfilter usw.
  3. $ this- & gt; blogEntryFactory- & gt; create ();

Allerdings ist # 1 schlecht, weil es eine starke Kopplung erzeugt. # 2 scheint immer noch schlecht, weil es bedeutet, dass die Objekt-Factory zuvor injiziert werden muss - und alle anderen Objekte, die sie erstellen kann, freigelegt wird.

Nummer 3 scheint in Ordnung, aber wenn ich # 3 verwende, lege ich die "neuen" Schlüsselwörter in die blogEntryFactory selbst, ODER, injiziere ich den Loader in die blogEntryFactory und benutze den Loader?

Wenn ich viele verschiedene Fabriken wie blogEntryFactory habe (zum Beispiel könnte ich userFactory und commentFactory haben), würde es so aussehen, als würde das "neue" Schlüsselwort über all diese verschiedenen Fabriken zu Abhängigkeitsproblemen führen.

Ich hoffe, das macht Sinn ...

HINWEIS

Ich habe einige Antworten darauf erhalten, dass dies für dieses spezielle Blog-Beispiel unnötig ist, aber es gibt tatsächlich Fälle, in denen Sie das abstrakte Fabrikmuster verwenden sollten, und das ist der Punkt, an dem ich mich befinde. Verwenden Sie in diesem Fall "neu" oder machen Sie etwas anderes?

    
johnnietheblack 02.02.2012, 18:52
quelle

1 Antwort

4

Ich bin kein Experte, aber ich werde einen Fehler machen. Dies setzt voraus, dass Blog nur ein Datenmodellobjekt ist, das als Container für einige Daten fungiert und vom Controller gefüllt wird ( new Blog ist nicht sehr aussagekräftig). In diesem Fall ist Blog ein Blatt des Objektdiagramms und die Verwendung von new ist in Ordnung. Wenn Sie Methoden testen möchten, die ein Blog erstellen müssen, müssen Sie gleichzeitig die Erstellung von Blog testen, und die Verwendung eines Mock-Objekts macht keinen Sinn. Das Blog bleibt nicht erhalten diese Methode.

Als ein Beispiel, sagen wir, dass PHP kein Array-Konstrukt hatte, sondern ein Collections-Objekt. Würdest du $this->collectionsFactory->create() nennen oder würdest du new Array; sagen?

    
Explosion Pills 02.02.2012, 20:15
quelle