Для проекта, над которым я работаю, мне нужно создавать объекты, используя разные форматы исходных данных, более или менее как это:
public class FooService
{
protected DataFormat Format { get; set; }
public FooService(DataFormat format = DataFormat.Json)
{
Format = format;
}
public Foo GetFoo(int id)
{
string content = GetContentInFormat("someuri/foo/" + id, Format);
// Something here must create a "Foo" object
// based on Format, which could be Json, Xml or other
}
}
public enum DataFormat
{
Json,
Xml
}
Я знаю, что мог бы:
1) Используйте разные методы и выберите правильный в зависимости от формата:
switch (Format)
{
case DataFormat.Xml:
return CreateFooFromXml(content);
case DataFormat.Json:
return CreateFooFromJson(content);
default:
throw new Exception("Invalid format.");
}
Минусы: будет создано не менее 8 различных типов таким образом, поэтому мне нужно что-то более расширяемое и поддерживаемое.
2) Сделать FooService интерфейсом или абстрактным классом и реализовать конкретные классы, по одному для каждого формата.
Минусы: бизнес-логика в всех классах будет всегда одинаковыми, за исключением случая создания экземпляра класса.Может быть сбивает с толку наличие JsonFooService
и XmlFooService
.
Я хотел бы знать, что является лучшим решением для этого с точки зрения расширяемости и ремонтопригодности.