16 Stimmen

Was ist der Unterschied zwischen dem Service Locator und dem Factory Design Pattern?

Ich benutze Unity und ich erstelle eine Klasse, die es umhüllt und ich weiß nicht, wie man es, Service-Locator oder Fabrik aufrufen, beide kapseln die Erstellung der Objekte, so.... was ist der Unterschied?

35voto

Miguel Angelo Punkte 23208

Eine Fabrik erstellt Objekte für Sie, wenn Sie es wünschen.

Der Service Locator gibt Objekte zurück, die möglicherweise bereits existieren, d. h. Dienste, die bereits irgendwo für Sie existieren könnten.

Denken Sie einfach an die Bedeutung der Namen:

  • Fabrik: ist ein Ort, an dem Objekte hergestellt werden.
  • Dienstleistung: ist etwas, das als Dienstleistung etwas für Sie tun kann.
  • Service Locator: ist etwas, das etwas finden kann, das einen Dienst ausführen kann.

12voto

jfuentes Punkte 457

Eigentlich gibt es eine klare Trennung zwischen diesen beiden Mustern. Es ist allgemein bekannt, dass beide Muster verwendet werden, um Abhängigkeiten von konkreten Typen zu vermeiden.

Doch nach der Lektüre

Es ergeben sich einige schwerwiegende Widersprüche:

sagte Seemann: "Eine abstrakte Fabrik ist ein generischer Typ, und der Rückgabetyp der Methode Create wird durch den Typ der Fabrik selbst bestimmt. Mit anderen Worten: Ein konstruierter Typ kann nur Instanzen eines einzigen Typs zurückgeben."

Rober C. Martin hat zwar nichts über generische Typen erwähnt, aber das Factory-Beispiel in seinem Buch erlaubt es, Instanzen von mehr als einem Objekttyp zu erstellen und zwischen ihnen zu unterscheiden, indem ein Schlüsselstring als Parameter in Factory.Make() verwendet wird.

Gamma sagte, dass die Absicht von Abstract Factory darin besteht, "eine Schnittstelle für die Erstellung von Familien verwandter oder abhängiger Objekte bereitzustellen, ohne deren konkrete Klassen zu spezifizieren". Es ist erwähnenswert, dass das Beispiel der abstrakten Fabrik von Gamma gegen das von Martin erklärte Prinzip der Schnittstellentrennung (ISP) verstößt. ISP und SOLID im Allgemeinen sind modernere Prinzipien, die vielleicht der Einfachheit halber weggelassen wurden.

Die Arbeiten von Gamma und Martin gehen den Arbeiten von Seemann voraus, so dass er sich meiner Meinung nach an die bereits vorgenommene Definition halten sollte.

Während Fowler den Service Locator als eine Möglichkeit zur Implementierung der Dependency Inversion vorschlägt, betrachtet Seemann ihn als Anti-Pattern. Weder Gamma noch Martin erwähnen Service Locator.

Seemann und Fowler sind sich jedoch darin einig, dass der Service Locator einen Konfigurationsschritt benötigt, um eine Instanz einer konkreten Klasse zu registrieren, die später zurückgegeben wird, wenn ein Objekt dieser Art angefordert wird. Dieser Konfigurationsschritt wird von Martin und Gamma in ihrer Definition von Abstract Factory nicht erwähnt. Das Muster der abstrakten Fabrik geht davon aus, dass jedes Mal, wenn ein Objekt dieser Art angefordert wird, ein neues Objekt instanziiert werden muss.

Schlussfolgerung

Der Hauptunterschied zwischen Service Locator und Abstract Factory besteht darin, dass Abstract Factory voraussetzt, dass ein neues Objekt instanziiert und bei jeder Anforderung zurückgegeben wird, während Service Locator mit einer Objektinstanz konfiguriert werden muss und jedes Mal die gleiche Instanz zurückgegeben wird.

5voto

Tomasz Jaskuλa Punkte 15373

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