доброе время суток уважаемым участникам форума!
В нашей компании есть маленькая программка, которая генерирует заказы нашим дилерам. большинство дилеров принимает заказы в нашей стандартной форме, но некоторые дилеры требует от нас, чтобы мы отправляли им заказы в их форме.
У нас есть абстрактный класс DealerOrderGenerator, от которого наследуются классы, обеспечивающие генерацию заказа дилеру в нужном формате, т.е. классы типа DefaultOrderGenerator, ComplexFormatOrderGenerator, SomeOtherCompanyNameOrderGenerator.
Нужно связать поставщика с определенным форматом заказа. Это можно сделать очень тупо:
DealerOrderGenerator CreateDealerOrderGenerator(Dealer dealer, Order order)
{
switch(dealer.Name)
{
case "CompanyName":
return new SomeOtherCompanyNameOrderGenerator(order);
case "AnotherCompanyName":
return new AnotherCompanyNameOrderGenerator(order);
default:
return new DefaultOrderGenerator(order);
}
}
понятно, что это не самый лучший дизайн для фабричного метода.
Можно заменить имена дилеров, на их ID — уже лучше, но тоже не хорошо.
Поэтому видимо надо напрячься и сделать у класса Dealer и в таблице Dealers поле OrderFormatID, а так же сделать таблицу OrderFormats. В коде же сделать enum OrderFormats, и результирующий код будет к примеру таким:
enum OrderFormats
{
Default = 1,
CompanyA = 2,
CompaniesBC = 3
}
DealerOrderGenerator CreateDealerOrderGenerator(Dealer dealer, Order order)
{
switch((OrderFormats)dealer.OrderFormatID)
{
case OrderFormats.CompanyA:
return new CompanyAOrderGenerator(order);
// и т.д.
}
}
но в этом случае все равно придется следить за тем чтобы значения в таблице OrderFormats и в enum'е OrderFormats не рассинхронизировались.
что уважаемые гуру думают о таком решении? или как-то можно сделать по другому, лучше и проще?