Вот как я обычно видеть шаблон Abstract Factory показано ниже:Abstract Factory Pattern - Точка бетонных заводов
public abstract class Factory
{
public abstract Product GetProduct();
}
public class ConcreteFactory1 : Factory
{
public override Product GetProduct() { return new Product1(); }
}
class ConcreteFactory2 : Factory
{
public override Product GetProduct() { return new Product2(); }
}
interface Product
{
void SomeMethod();
}
class Product1 : Product
{
public void SomeMethod() { Console.WriteLine("1"); }
}
class Product2 : Product
{
public void SomeMethod() { Console.WriteLine("2"); }
}
class Program
{
static void Main(string[] args)
{
Factory f = null;
Product p = null;
switch (args[0])
{
case "1":
f = new ConcreteFactory1();
p = f.GetProduct();
break;
case "2":
f = new ConcreteFactory2();
p = f.GetProduct();
break;
}
p.SomeMethod();
}
}
Я обычно пишу это так, что не является истинной картины:
interface Product
{
void SomeMethod();
}
class Product1 : Product
{
public void SomeMethod() { Console.WriteLine("1"); }
}
class Product2 : Product
{
public void SomeMethod() { Console.WriteLine("2"); }
}
public static class Factory
{
public static Product GetProduct(prodType)
{
Product p = null;
switch (prodType)
{
case "1":
p = new Product1();
break;
case "2":
p = new Product2();
break;
}
return p;
}
}
class Program
{
static void Main(string[] args)
{
Product p = Factory.GetProduct(args[0]);
p.SomeMethod();
}
}
Мой вопрос: в чем преимущество конкретных заводов? Я никогда не понимал смысла - кажется, это просто лишний лишний слой. Второй пример выглядит гораздо более кратким и простым.
Я думаю, и исправьте меня, если я ошибаюсь, так это то, что обычно ваш код базового уровня не имеет понятия о конкретной используемой фабрике. Также не следует указывать тип продукта (в вашем случае) через 'prodType'. Вместо этого, конкретная реализация фабрики подается через некоторую форму инъекции зависимостей на ваш абстрактный завод, и ваш код продолжает веселиться, не имея понятия о том, какая фабрика используется, или о конкретных типах. Особенно, если эти конкретные заводские реализации предоставляются сторонними потребителями вашего API. –
@Chris Точно. – Odrade
Если у вас есть много продуктов, ваш единственный завод получит очень, очень большой. Если вы когда-либо решили сменить завод, на котором производится продукт, все ваши клиенты должны будут измениться, поскольку завод не будет отвлекаться от них. Они имеют прямую ссылку на ваш единственный завод. – dash