gpt4 book ai didi

c# - 泛型或非泛型类上的静态工厂方法?

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:56 24 4
gpt4 key购买 nike

我有一个泛型类,我们称它为MyClass<T> ,这将需要一个工厂方法,以便从客户端代码中抽象出构造函数的细节。

这两个选项哪个是正确的? (包括示例实例化代码)

  1. 原始通用上的静态非通用工厂方法MyClass<T> :

    MyClass<SomeType> instance = MyClass<SomeType>.CreateNew();
  2. 专用的非通用静态通用工厂方法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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com