使用此代码:
public static class ChocolateFactory<T>
{
private static Func<int, int, T> Func { get; set; }
static ChocolateFactory()
{
ChocolateFactory<EmergencyChocolate>.Func = (a, b) => new EmergencyChocolate(a, b);
}
public static T CreateChocolate(int a, int b)
{
return (T)Activator.CreateInstance(typeof(T), a, b);
//return ChocolateFactory<T>.Func(a, b);
}
}
如果我跑:
var myChocolate = ChocolateFactory<EmergencyChocolate>.CreateChocolate(1, 2);
两种创作方法之间是否存在显着差异(一种是注释掉的)?激活器在代码方面更清晰,但我知道它可能会更慢,但我想知道我是否可以忽略其他任何东西。我也想知道这里是否有任何预编译。
此外,如果不使用Activator,这里的方法名称是什么?
答案 0 :(得分:7)
如果您使用Activator.CreateInstance
,则无需进行静态检查。编译器无法检查是否存在具有两个int
参数的公共构造函数。
它可能更慢,因为它使用反射。
答案 1 :(得分:0)
使用激活器类,您可以通过只有一个方法生成任何类型的实例。
使用工厂方法,您只能创建一个类的实例,而对于另一个类,您必须创建不同的工厂方法。
Activator并不比另一个更干净。这取决于你想做什么。 IoC容器通常使用Activator,因为它无法为所有类创建工厂方法,因为它根本不知道你有什么。