Я не верю, что решение мистера Карвера строго следует структуре фабричного образца, описанного в книге GOF Design Pattern.Тем не менее, это очень распространенная идиома программирования (простая фабрика) и, вероятно, хороший подход для этого дизайна.
Фабричный образец требует, чтобы Конкретный Создатель был получен от Создателя.Как правило, Создатель делегирует создание продукта Конкретному Создателю.Это полезно, когда новая фабрика может быть добавлена в будущем.Например, представьте, что вы создали новую фабрику, которая могла бы производить определенные продукты с меньшими ресурсами (счетчик используется в качестве прокси для «ресурса»).
public interface IProduct
{
void PerformService();
}
public class ProductA : IProduct
{
public void PerformService()
{
Console.WriteLine("Product A's service.");
}
}
public class ProductB : IProduct
{
public void PerformService()
{
Console.WriteLine("Product B's service.");
}
}
public class ProductC : IProduct
{
public void PerformService()
{
Console.WriteLine("Product C's service.");
}
}
abstract class ProductFactory
{
public abstract IProduct CreateProduct(int count);
}
class OriginalFactory : ProductFactory
{
public override IProduct CreateProduct(int count)
{
if (count < 10)
{
return new ProductA();
}
else if (count == 10)
{
return new ProductB();
}
else if (count > 10)
{
return new ProductC();
}
else
{
return null;
}
}
}
class NewFactory : ProductFactory
{
public override IProduct CreateProduct(int count)
{
if (count < 20)
{
return new ProductA();
}
else if (count == 20)
{
return new ProductB();
}
else if (count > 20)
{
return new ProductC();
}
else
{
return null;
}
}
}
public class FactoryTest
{
public void TestNew()
{
ProductFactory factory = new NewFactory();
IProduct product = factory.CreateProduct(10); // Product B
product.PerformService();
}
public void TestOld()
{
ProductFactory factory = new OriginalFactory();
IProduct product = factory.CreateProduct(10); // Product A
product.PerformService();
}
}