В чем разница между фабрикой и моделями проектирования трубопроводов? - PullRequest
2 голосов
/ 29 марта 2012

В чем разница между шаблонами проектирования фабрики и конвейера?

Я спрашиваю, потому что мне нужно создать классы, у каждого из которых есть метод, который определенным образом преобразует текстовые данные.

У меня есть другие классы, данные которых необходимо преобразовать.Однако порядок и выбор преобразований зависит (и только от), от какого базового класса, от которого наследуются эти классы.

Является ли это каким-то образом связанным конвейером и / или шаблоном фабрики?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Factory создает объекты без предоставления клиенту логики создания экземпляров и обращается к вновь созданному объекту через общий интерфейс .Таким образом, цель состоит в том, чтобы клиент полностью не знал, какой конкретный тип продукта он использует и как этот экземпляр создан.

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.Вы можете пропустить настройку.Или вы можете прочитать некоторые данные из базы данных раньше.Что-нибудь.

Здесь мы идем в Pipeline. Конвейерная задача состоит в том, чтобы разделить большую задачу обработки на последовательность меньших независимых шагов обработки (Фильтры).Если создание ваших объектов является большой задачей и шаги установки независимы, вы можете использовать конвейер для настройки внутри фабрики.Но шаг инстанции определенно не независим в этом случае.Это должно произойти до других шагов.

Таким образом, вы можете предоставить Фильтры (например, Трубопровод) для настройки вашего продукта:

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 голосов
/ 29 марта 2012

Фабрика отвечает за создание объектов:

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

...