使用通过私有构造函数返回新实例的静态方法是否有优势?

时间:2012-10-01 10:41:52

标签: c# static constructor private

我偶尔会看到的模式是这样的:

public class JustAnotherClass
{
    private JustAnotherClass()
    {
        // do something
    }

    static JustAnotherClass GetNewClass()
    {
        return new JustAnotherClass();
    }
}

为什么这会比仅仅拥有一个公共构造函数更有优势呢?

6 个答案:

答案 0 :(得分:4)

  

为什么这会比仅仅拥有一个公共构造函数更有优势呢?

这是一种工厂模式。您可以在这些实例中创建一个点。

优势在于,在将来的扩展中,您可以添加逻辑,例如返回派生类实例。或者在某些条件下返回null。构造函数无法返回null

答案 1 :(得分:0)

我认为只使用static方法创建新对象没有任何优势。它直接调用构造函数或多或少是等价的。

它使代码更具可扩展性,这是公共构造函数无法实现的。检查Henk holterman的答案。

答案 2 :(得分:0)

  1. 它可以返回派生类。
    有时你有不同的基类内部实现,消费者不应该知道他得到了哪一个,因为它是一个实现细节。
  2. 它有一个名字。
    我经常使用它而不是重载构造函数,因此这个新实例的含义变得更加清晰。
  3. 我最近的一个项目的一个例子:我有一个代表非对称密钥对的类。构造函数受到保护,有两种工厂方法:FromPrivateKey(byte[])GenerateIdentity()。 IMO使消费代码更易于阅读。

答案 3 :(得分:0)

好问题。您显示的类是工厂(请参阅工厂模式)。所以“为什么要使用工厂”......正如我所说的那样一个好问题。

对我来说,当我需要在运行时(很多次)创建实例时,我会使用工厂。为什么?因为它使我的代码更容易使用单元测试进行测试。这是对你问题的一个答案,如果你不对你的代码进行单元测试(也许是TDD)则无关紧要。这里没有错误或权利,只是一个事实。

要回答你的问题,请问'为什么要使用工厂'。

答案 4 :(得分:0)

除了灵活之外,如果要在构造函数中使用参数(至少是此行为)和XML序列化,则需要使用此方法。

答案 5 :(得分:0)

在你的例子中,没有真正的优势。如果要控制何时以及如何创建类的实例,可以使用工厂方法。一些例子:

  • 您想要实现 Singleton ,它总是返回相同的实例;
  • 您希望实现缓存并确保仅在没有现有实例可用时才创建新实例;
  • 您需要根据外部信息控制何时创建实例。例如,您可能正在映射文件系统,并希望确保对于相同的路径名,不存在File类的两个实例。