我有一个(增长的)数据生成器列表。我需要的生成器是由工厂类创建的。生成器都实现了一个通用接口,其中包括一个静态字符串name
。工厂模式,按属性选择
我想要做的是:用上述名字的字符串参数调用factory.Create方法。 create方法找到具有该名称的生成器并返回该生成器的新实例。
在我看来这样做的奖励:我只需要添加新的生成器类,而无需编辑工厂。
问:
- 这是处理这个问题的好办法?
- 我怎样才能找到所有的发电机?反映每个接口/名称空间的每个成员(对于生成器+它们的接口都是唯一的)的实现?
- 称这种工厂工作方式是正确的,还是这种不同的模式?
最后,我会打电话的工厂像这样(简化):
//Caller
public DataModel GetData2()
{
var generator = new DataFactory().Create("Gen.2");
return generator.GetData();
}
//Factory
public class DataFactory
{
public AbstractDataGenerator Create(string type)
{
//Here the magic happens to find all implementations of IDataGenerator
var allGenerators = GetImplementations();
var generator = allGenerators.FirstOrDefault(f => f.name == type);
if (generator != null)
return (AbstractDataGenerator)Activator.CreateInstance(generator);
else
return null;
}
}
//Interface
public abstract class AbstractDataGenerator
{
public static string name;
public abstract DataModel GetData();
}
//Data-Generators
public class DataGen1 : AbstractDataGenerator
{
public static string name = "Gen.1";
public DataModel GetData()
{
return new DataModel("1");
}
}
public class DataGen2 : AbstractDataGenerator
{
public static string name = "Gen.2";
public DataModel GetData()
{
return new DataModel("2");
}
}
应在工厂魔术GetImplementations()
通过反射来完成,或者以某种方式有什么不同?我应该使用完全不同的方法吗?
由于答案涉及IoC和DI:该项目已经使用NInject,因此它将可用。 从接口切换到抽象类。
一个问题我已经使用这种方法发现的是,为了获得发电机的“名称”属性,你_need的object_的一个实例。 – stuartd
这就是为什么我使属性静态。如果我没有弄错,这应该删除一个实例的需要。 – MilConDoin
接口不能有静态成员.. – stuartd