2013-08-06 10 views
14

Das ist etwas worüber ich während der Erstellung einer AngularJS App nachgedacht habe. Als ich zum ersten Mal von AngularJS Fabriken gelernt, dachte ich eine kluge Nutzung von ihnen wäre zu erstellen und eine Konstruktorfunktion eher als ein einfaches Objekt zurück, das heißt so etwas wie:AngularJS-Entwurfsmuster: Soll ich Konstruktoren verwenden, um Konstruktorfunktionen zu erstellen?

app.factory("Foo", function() { 
    function Foo(bar, baz) { 
    this.bar = bar; 
    this.baz = baz; 
    ... 
    } 

    Foo.prototype = { 
    constructor: Foo, 
    method1: function() { ... }, 
    method2: function() { ... }, 
    ..., 
    methodn: function() { ... }, 
    }; 

    return Foo; 
}); 

Dann könnten Sie die Funktion in Ihr injizieren Controller und rufen Sie es mit new. Ich fand das ästhetisch ansprechend und OOP-y, aber jetzt fange ich an zu denken, dass es eigentlich ein Anti-Muster ist. Das Problem ist, dass es gut funktioniert, wenn Sie in AngularJS-konformen Kontexten arbeiten, aber wenn Sie beispielsweise den Konstruktor von der Konsole aus aufrufen möchten, verwenden Sie ihn in einem Web Worker oder verwenden Sie den Code in einem nicht AngularJS App, Sie müssen anfangen zu arbeiten um AngularJS anstatt mit ihm. Ich begann mich zu fragen, ob diese Herangehensweise fehlgeleitet ist, da Funktionen in Javascript bereits "Singletons" zu sein scheinen und keine Hilfe benötigt werden, um instanziiert zu werden.

Verwende ich AngularJS-Fabriken? Wäre ich besser mit Konstruktorfunktionen ausgestattet, die dem globalen Geltungsbereich ausgesetzt sind? Gibt es allgemein spezifische Faktoren, die die Nutzung von AngularJS-Fabriken/-Dienstleistungen/-Anbietern gegenüber globalen Objekten oder umgekehrt fördern?

+1

Anstatt den Wert der Abhängigkeitsauflösung, die von einem Dependency-Injection-Container bereitgestellt wird, kurzzuschließen, würde ich vorschlagen, nachzusehen bei der Dekoratormusterunterstützung OOTB von $ provider.decorator (...) in Angular-Dokumenten. Das Freilegen eines Prototyps ist nicht "böse", aber wenn Sie bei einer Komponente, die Abhängigkeiten aufweist, die Sie lösen, "neu" nennen, bin ich mir nicht sicher, was Sie gewinnen, außer vielleicht konfigurierbare Prototypen basierend auf einem Kontext. Wenn Sie danach suchen, können Sie $ inject.get ('myWhatever') verwenden, um es in Service Locator umzuwandeln. – SonOfNun

+2

Es ist keine gute Idee. Die Idee einer Fabrik ist es, einen Wert zu liefern, ohne sich Gedanken darüber machen zu müssen, wie sie aufgebaut ist. [Diese Antwort gibt eine gute Erklärung zur Verwendung von Fabriken, Dienstleistungen und Anbietern] (http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory). – Bart

Antwort

6

Ja!

Fabriken Syntax: module.factory ('factoryName', Funktion); Ergebnis: Wenn Sie factoryName als injizierbares Argument deklarieren, erhalten Sie den Wert , der durch den Aufruf der Funktionsreferenz an module.factory zurückgegeben wird. Verwendung: Kann nützlich sein, um eine "Klassen" -Funktion zurückzugeben, die dann neu erstellt werden kann, um Instanzen zu erstellen.

Quelle: https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J

Der obige Link auch als Quelle Bart's Kommentar verwendet wird: AngularJS: Service vs provider vs factory

0

Vielleicht ist dies eine schöne und bequeme Nutzung in Zusammenhang mit Winkel- und Javascript (was passiert, erlauben verwirrende Manipulationen mit Konstruktoren und Objektprototypen), aber meiner Meinung nach widerspricht es etwas der klassischen Fabrikmusterlogik.

Factory ist dazu gedacht, neue Objekte darin zu konstruieren, wobei einige Konfigurations-, Initialisierungs- und Injizierungsabhängigkeiten in das neu erstellte Objekt übernommen werden, wie in den Werkseinstellungen angegeben (falls vorhanden).

Zum Beispiel können Sie eine Fabrik bitten, eine Speicherverbindung zu erstellen, und die Fabrik erstellt eine MySQL-Verbindung, SQLite-Verbindung oder Redis-Verbindung - Ihr Controller kümmert sich nicht wirklich, solange das konstruierte Objekt eine Schnittstelle implementiert (oder verwenden Sie die Enttippung im Javascript-Kontext - wenn es wie eine Ente quakt, ist es eine Ente.

Aber wenn Sie new Schlüsselwort verwenden, nachdem Sie einer Fabrik außerhalb der Fabrik genannt haben, dann wie es ist, wenn man folgendes sagen:

„Hey, Fabrik, gib mir einen Prototyp (Konstruktor) einiger Artikel und ich werde das Objekt selbst erstellen."

Also, in diesem Fall, dass Ihr Werk ist kein‚klassisches Werk‘für neue Objekte zu schaffen, sondern eine Prototyp-Fabrik, die einen Prototyp für alle Anrufer zu bieten hat, so dass sie sich neue Objekte herstellen können.

Wenn Sie haben einfache Konstrukteure ohne irgendwelche Argumente, Sie könnten damit einverstanden sein, aber im klassischen Beispiel (die Speicherverbindung) macht solch eine Verwendung von Fabriken keinen Sinn, weil dann der Anrufer der Fabrik die Arbeit der Fabrik erledigen muss - injizieren Konfigurationen und Abhängigkeiten zu dem neu erstellten Objekt

Verwandte Themen