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

标签 c# .net design-patterns factory factory-pattern

我有一个泛型类,我们称之为 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/

相关文章:

c# - 从 NetworkStream 读取到分隔符

c# - 记录 WCF 消息大小

c# - 如何使用 Azure 存储 SDK 将 Azure 文件存储上的文件从一个子文件夹移动到另一个子文件夹?

c# - 查找我的可执行文件所在文件夹的首选方法是什么?

design-patterns - 如何实现消息的定期摘要?

java - 替换巨大的案例陈述

c# - Linq 中的 SQL YEAR(),MONTH()

c# - 监视 Windows 上字体的安装/卸载

.net - 查找并替换字符串中的特定字符

javascript - 在 JavaScript 中,!function(){}() 相对于 (function () {})() 的优势是什么?