2

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

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

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

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

4

6 回答 6

4

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

这是工厂模式。您有一个创建这些实例的点。

优点是在未来的扩展中您可以添加逻辑,例如返回派生类实例。null或在某些条件下返回。构造函数不能返回null

于 2012-10-01T10:46:15.743 回答
0

我没有看到static仅仅创建一个新对象的方法有什么好处。直接调用构造函数或多或少是等价的。

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

于 2012-10-01T10:46:48.600 回答
0
  1. 它可以返回派生类。
    有时你有一个基类的不同内部实现,消费者不应该知道他得到的是哪一个,因为它是一个实现细节。
  2. 它有一个名字。
    我经常使用它而不是重载构造函数,因此这个新实例的含义变得更加清晰。

我最近的一个项目中的一个例子:我有一个代表非对称密钥对的类。构造函数是受保护的,并且有两个工厂方法: FromPrivateKey(byte[])GenerateIdentity(). IMO 这使得使用代码更容易阅读。

于 2012-10-01T10:48:29.260 回答
0

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

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

要回答您的问题,请询问“为什么要使用工厂”。

于 2012-10-01T10:48:55.383 回答
0

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

于 2012-10-01T10:49:49.067 回答
0

正如在您的示例中那样,没有真正的优势。当您想控制何时以及如何创建您的类的实例时,您可以使用工厂方法。一些例子:

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