Ответ 1
Они являются примерами шаблона метода factory. Единственное отличие состоит в том, что второй пример имеет метод в своем собственном статическом классе.
Это будет пример абстрактного шаблона factory:
abstract class MessageProcessorFactory
{ public abstract MessageProcessor GetProcessor
(Message message, DataDomain data);
}
class FooMessageProcessorFactory : MessageProcessorFactory
{ public override MessageProcessor GetProcessor
(Message message, DataDomain data)
{ return new FooMessageProcessor(data.Name, data.Classification);
}
}
Каждый MessageProcessor получает свой собственный класс factory, который использует полиморфизм.
Передача ProcessBuilder для создания процесса будет шаблоном стратегии:
class MessageProcessor
{ ProcessBuilder builder;
public MessageProcessor(ProcessBuilder builder)
{ this.builder = builder;
}
public void Process()
{ builder.BuildMessage();
builder.BuildProcess();
builder.Process();
}
}
var mp = new MessageProcessor(new FooProcessBuilder());
Простейшим решением было бы инкапсулировать метод factory:
static void Process(Message msg, DataDomain data)
{ var p = getProcessor(msg.GetType());
p.Process(msg, data);
}
Если это небольшое известное количество типов, вы можете использовать серию проверок типов:
private static MessageProcessor getProcessor(Type msgType)
{ return (msgType == typeof(FooMessage)) ? new FooMessageProcessor()
: (msgType == typeof(BarMessage)) ? new BarMessageProcessor()
: new DefaultMessageProcessor();
}
В противном случае используйте словарь:
Dictionary<Type,MessageProcessor> processors;
private static MessageProcessor getProcessor(Type msgType)
{ return processors[msgType];
}