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();
}
А на конкретных заводах вы можете настроить собственный набор фильтров для вашего конвейера установки.