2012-03-29 14 views
2

工場とパイプラインの設計パターンの違いは何ですか?工場とパイプラインの設計パターンの違いは何ですか?

私はクラスを作成する必要があるので、私は質問しています。それぞれには、テキストデータを特定の方法で変換するメソッドがあります。

データを変換する必要がある他のクラスがあります。ただし、変換の順序と選択は、これらのクラスが継承する基本クラスに依存します(オンにのみ依存します)。

これは何らかの形でパイプラインおよび/または工場パターンに関連していますか?

+0

、あなたが例を私たちに提供してくださいできますか? –

答えて

2

ファクトリは、インスタンス化ロジックをクライアントに公開せずにオブジェクトを作成し、共通インタフェースを介して新しく作成されたオブジェクトを参照します。したがって、クライアントが使用する具体的な製品の種類とそのインスタンスの作成方法をクライアントが完全に認識しないようにすることが目標です。

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 
    } 
} 

すべての作成の詳細はカプセル化されています。 new()呼び出しでインスタンスを作成できます。あるいは、既存のサンプルFooProductをいくつかクローンすることもできます。セットアップをスキップできます。あるいは、前にデータベースからいくつかのデータを読むことができます。何でも。

ここではパイプラインに行きます。 パイプラインの目的は、より大きな処理タスクをより小さい独立した処理ステップのシーケンスに分割することです。(フィルタ)。オブジェクトの作成が大きなタスクであり、セットアップ手順が独立している場合は、工場内のセットアップにパイプラインを使用できます。しかし、インスタンス化のステップはこの場合独立していません。それは他のステップの前に起こります。

だから、あなたはセットアップ製品にフィルタ(すなわち、パイプライン)を提供することができます

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(); 
} 

そしてカスタムセットアップパイプライン用のフィルタの設定を設定することができ、コンクリート工場インチ

0

工場は、オブジェクトを作成するための責任がある:

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

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

パイプラインを使用すると、小さなタスクに処理を分離するのに役立ちます。また、リニアパイプラインと非線形パイプラインがある

var searchQuery = new SearchQuery(); 

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

。リニアパイプラインでは、カテゴリ別、日付別、著者別にフィルタリングする必要があります。非線形パイプラインは、これらを同時にまたは任意の順序で実行することを可能にします。

この記事は非常によく、それを説明する:データ変換について

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

関連する問題