2012-03-29 69 views
2

工廠和管道設計模式有什麼區別?工廠和管道設計模式有什麼區別?

我在問,因爲我需要創建類,每個類都有一個方法可以以某種方式轉換文本數據。

我有其他類的數據需要進行轉換。但是,轉換的順序和選擇取決於(並且僅取決於)這些類從哪個基類繼承。

這是以某種方式相關的管道和/或工廠模式?

+0

關於數據轉換,你能請向我們提供一個例子嗎? – 2012-03-29 10:47:32

回答

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

相關問題