在乍一看,貌似正确回答你的问题是#1。这是因为你的班级是MyClass<T>
,因此工厂也应该是T
特定的。但还有更多的东西比这个简单的答案。
在继续之前,我会添加第三种可能性:非静态工厂类。依赖于工厂的对象会拥有一个公共属性,通过它可以接收工厂对象。如果没有其他实例被分配,属性的Getter将实例化默认工厂。这允许以后依赖注入,并且还有助于编写依赖于他们自己的假工厂的单元测试。解决方案会是这个样子(忽略了片刻仿制药):
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的基本类型大不相同。有机会专业化工厂可能是有益的。但是现在你明白为什么有一个静态工厂可能是一个坏主意 - 静态不能被扩展。
我认为这个问题是一个很好的人选[你最有争议的编程观点是什么?](http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion),但只适用于C#语言 –