昨天我问了一个关于使用反射或策略模式来动态调用方法的问题。
但是,从那时起,我决定将这些方法更改为实现公共接口的单个类。原因是,每个类虽然有一些相似之处,但也执行某些特定于该类的方法。
我一直在使用这样的策略:
switch (method)
{
case "Pivot":
return new Pivot(originalData);
case "GroupBy":
return new GroupBy(originalData);
case "Standard deviation":
return new StandardDeviation(originalData);
case "% phospho PRAS Protein":
return new PhosphoPRASPercentage(originalData);
case "AveragePPPperTreatment":
return new AveragePPPperTreatment(originalData);
case "AvgPPPNControl":
return new AvgPPPNControl(originalData);
case "PercentageInhibition":
return new PercentageInhibition(originalData);
default:
throw new Exception("ERROR: Method " + method + " does not exist.");
}
然而,随着潜在类的数量增加,我将需要不断添加新的类,从而打破关闭以进行修改的规则。
取而代之的是,我使用了一个解决方案:
var test = Activator.CreateInstance(null, "MBDDXDataViews."+ _class);
ICalculation instance = (ICalculation)test.Unwrap();
return instance;
实际上,_class参数是在运行时传入的类名。这是一种常见的方法吗,这样做会有任何性能问题吗?
我对思考还很陌生,所以欢迎你的建议。
发布于 2011-03-11 00:36:03
我建议你给你的工厂实现一个方法RegisterImplementation
。因此,每个新类都只是对该方法的调用,您不需要更改工厂代码。
更新:
我的意思是这样的:
创建定义计算的接口。根据您的代码,您已经这样做了。为了完整起见,我将在接下来的回答中使用以下接口:
public interface ICalculation
{
void Initialize(string originalData);
void DoWork();
}
您的工厂将如下所示:
public class CalculationFactory
{
private readonly Dictionary<string, Func<string, ICalculation>> _calculations =
new Dictionary<string, Func<string, ICalculation>>();
public void RegisterCalculation<T>(string method)
where T : ICalculation, new()
{
_calculations.Add(method, originalData =>
{
var calculation = new T();
calculation.Initialize(originalData);
return calculation;
});
}
public ICalculation CreateInstance(string method, string originalData)
{
return _calculations[method](originalData);
}
}
出于简单性的原因,这个简单的工厂类缺少错误检查。
更新2:
您可以在应用程序初始化例程中的某个位置对其进行如下初始化:
CalculationFactory _factory = new CalculationFactory();
public void RegisterCalculations()
{
_factory.RegisterCalculation<Pivot>("Pivot");
_factory.RegisterCalculation<GroupBy>("GroupBy");
_factory.RegisterCalculation<StandardDeviation>("Standard deviation");
_factory.RegisterCalculation<PhosphoPRASPercentage>("% phospho PRAS Protein");
_factory.RegisterCalculation<AveragePPPperTreatment>("AveragePPPperTreatment");
_factory.RegisterCalculation<AvgPPPNControl>("AvgPPPNControl");
_factory.RegisterCalculation<PercentageInhibition>("PercentageInhibition");
}
https://stackoverflow.com/questions/5262693
复制相似问题