2012-03-29 10 views
2

Was ist der Unterschied zwischen Fabrik- und Pipeline-Entwurfsmustern?Was ist der Unterschied zwischen Fabrik- und Pipeline-Entwurfsmustern?

Ich frage, weil ich Klassen machen muss, von denen jede eine Methode hat, Textdaten in einer bestimmten Weise zu transformieren.

Ich habe andere Klassen, deren Daten umgewandelt werden müssen. Die Reihenfolge und Auswahl der Transformationen hängt jedoch von (und nur von) der Basisklasse ab, von der diese Klassen erben.

Ist das irgendwie Pipeline und/oder ein Fabrikmuster?

+0

In Bezug auf Datentransformation, können Sie uns bitte mit einem Beispiel nennen? –

Antwort

2

Factory erstellt Objekte, ohne die Instanziierungslogik dem Client auszusetzen, und verweist auf das neu erstellte Objekt über eine gemeinsame Schnittstelle. Das Ziel besteht also darin, dem Kunden völlig bewusst zu machen, welche konkrete Art von Produkt es verwendet und wie diese Instanz erstellt wurde.

public interface IFactory // used by clients 
{ 
    IProduct CreateProduct(); 
} 

public class FooFactory : IFactory 
{ 
    public IProduct CreateProduct() 
    { 
     // create new instance of FooProduct 
     // setup something 
     // setup something else 
     // return it 
    } 
} 

Alle Erstellungsdetails sind gekapselt. Sie können die Instanz über den Aufruf new() erstellen. Oder Sie können ein vorhandenes Beispiel-FooProduct klonen. Sie können das Setup überspringen. Oder Sie können vorher einige Daten aus der Datenbank lesen. Etwas.

Hier gehen wir zu Pipeline. Zweck der Pipeline ist es, eine größere Verarbeitungsaufgabe in eine Folge von kleineren, unabhängigen Verarbeitungsschritten einzuteilen (Filter). Wenn die Erstellung Ihrer Objekte eine große Aufgabe ist UND die Installationsschritte unabhängig sind, können Sie die Pipeline für die Einrichtung innerhalb der Factory verwenden. Aber der Instantiierungsschritt ist in diesem Fall definitiv nicht unabhängig. Es Mast vor anderen Schritten auftreten.

So können Sie Filter (das heißt Pipeline) zur Einrichtung Ihr Produkt bieten:

public class BarFilter : IFilter 
{ 
    private IFilter _next; 

    public IProduct Setup(IProduct product) 
    { 
     // do Bar setup 

     if (_next == null) 
      return product; 

     return _next.Setup(product); 
    } 
} 

public abstract class ProductFactory : IProductFactory 
{ 
    protected IFilter _filter; 

    public IProduct CreateProduct() 
    { 
     IProduct product = InstantiateProduct(); 
     if (_filter == null) 
      return product; 

     return _filter.Setup(product); 
    } 

    protected abstract IProduct InstantiateProduct(); 
} 

Und in Betonwerken Sie können Setup benutzerdefinierte Filter für Ihre Setup-Pipeline festgelegt.

0

Factory ist für die Erstellung von Objekten verantwortlich:

ICar volvo = CarFactory.BuildVolvo(); 
ICar bmw = CarFactory.BuildBMW(); 

IBook pdfBook = BookFactory.CreatePDFBook(); 
IBook htmlBook = BookFactory.CreateHTMLBook(); 

Pipeline wird Ihnen helfen, die Verarbeitung in kleinere Aufgaben zu trennen:

var searchQuery = new SearchQuery(); 

searchQuery.FilterByCategories(categoryCriteria); 
searchQuery.FilterByDate(dateCriteria); 
searchQuery.FilterByAuthor(authorCriteria); 

Es gibt auch eine lineare Pipeline ist und nicht-lineare Pipeline. Lineare Pipeline würde erfordern, dass wir nach Kategorie, dann nach Datum und dann nach Autor filtern. Nicht-lineare Pipeline würde uns erlauben, diese gleichzeitig oder in beliebiger Reihenfolge zu betreiben.

Dieser Artikel erklärt es ganz gut:

http://www.cise.ufl.edu/research/ParallelPatterns/PatternLanguage/AlgorithmStructure/Pipeline.htm

Verwandte Themen