我有一个泛型类,我们称之为 MyClass<T>
,它需要有一个工厂方法,以便从客户端代码中抽象出构造函数的详细信息。
这两个选项哪个是正确的? (包含示例实例化代码)
原始通用上的静态非通用工厂方法
MyClass<T>
:MyClass<SomeType> instance = MyClass<SomeType>.CreateNew();
专用的非泛型静态上的静态泛型工厂方法
MyClass
实现:MyClass<SomeType> instance = MyClass.CreateNew<SomeType>();
最佳答案
乍一看,你的问题的正确答案似乎是#1。这是因为你的类(class)是 MyClass<T>
因此工厂也应该是 T
-具体的。但这不仅仅是这个简单的答案。
在继续之前,我会添加第三种可能性:非静态工厂类。依赖于工厂的对象将具有公共(public)属性,通过该属性它接收工厂对象。如果没有分配其他实例,属性的 getter 将实例化默认工厂。这允许稍后进行依赖注入(inject),并且还有助于编写依赖于自己的假工厂的单元测试。解决方案看起来像这样(暂时忽略泛型):
public class ISomeFactory { ... }
public class DefaultSomeFactory: ISomeFactory { ... }
public class ClientClass
{
public ISomeFactory FactoryOfSome // Right place for dependency injection
{
get
{
if (_fact == null)
_fact = new DefaultFactory();
return _fact;
}
set { _fact = value; }
}
private ISomeFactory _fact;
}
现在正如我所说,你的类带有通用参数 MyClass<T>
然后工厂也应该使用通用参数:Factory<T>
。这个方案比一般工厂上的泛型方法要好,因为创建一个实例可能是T
-具体的。使用通用工厂的解决方案可以让您:
public class SpecialSomeFactory: DefaultSomeFactory<string> { ... }
通过这种方式,您可以覆盖现有工厂类的行为,并有另一种方法来生成专门用于字符串的实例。这很重要,因为处理字符串通常与处理 int 或 double 等基本类型有很大不同。有机会使工厂特化可能是有益的。但现在您明白为什么拥有静态工厂可能是一个坏主意 - 静态无法扩展。
关于c# - 泛型或非泛型类上的静态工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666525/