我有一個(增長的)數據生成器列表。我需要的生成器是由工廠類創建的。生成器都實現了一個通用接口,其中包括一個靜態字符串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