【发布时间】:2012-03-26 21:36:40
【问题描述】:
对于我正在进行的项目,我需要使用不同的源数据格式创建对象,或多或少像这样:
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 可能会让人感到困惑。
我想知道从可扩展性和可维护性的角度来看,最好的解决方案是什么。
【问题讨论】:
-
澄清一下,您需要一个可以根据不同输入(JSON、XML 等)创建对象的服务吗?那么,返回的对象永远是一样的,只是输入的不同?这听起来确实很像您的代码有些混乱,并且通过一些重组,您只需要使用策略模式'
-
@JustinPihony 我知道这看起来很令人困惑,但是是的,这就是我所需要的。问题是使用这种方法会创建许多不同的对象,我觉得策略不是最合适的。
标签: c# design-patterns