C++中适当的工厂模式

Bab*_*ish 5 c++ oop std factory-pattern

在C#中,您必须在类中声明所有内容,因此示例工厂模式可能如下所示:

namespace MySpace {

public class CFactory
{
  public static CFactory Current()
  {
    static CFactory singleton;
    return singleton;
  }
  public CBase Create() { return null; }
}

}
Run Code Online (Sandbox Code Playgroud)

在C++中,你没有这个限制.所以将"工厂"方法作为全局函数而不是让它们成为一个类被认为是"不好的做法"?

例1:

namespace MySpace {

// factory method
std::shared_ptr<CBase> CreateBase() { return NULL; }

}
Run Code Online (Sandbox Code Playgroud)

例2:

namespace MySpace {

// factory class
class CFactory
{
public:
  std::shared_ptr<CBase> CreateBase() { return NULL; }
};

// factory method exposing class
CFactory& GetFactory()
{
  static CFactory singleton;
  return singleton;
}

}
Run Code Online (Sandbox Code Playgroud)

例3:

namespace MySpace {

// factory class with no global function
class CFactory
{
public:
  std::shared_ptr<CBase> CreateBase() { return NULL; }

public:
  static CFactory& getFactory()
  {
     static CFactory singleton;
     return singleton;
  }
};

}
Run Code Online (Sandbox Code Playgroud)

std库为"工厂方法"使用了很多全局函数.这个例子就是std :: make_shared.

我之前使用过这两种情况,但我不确定一种情况是否会被认为是"更好"

Dre*_*ann 3

您可以从标准库中的用法推测命名空间全局工厂并不是隐式错误的。没有什么可以阻止它是正确的。

将工厂包装在类中的方法是一种组织变革。组织本身没有好坏之分。它可以做得好,也可以做得不好。

您应该可以采用适合其上下文的任何方法。我也看到这两种方法被多次使用,但都不是特别有问题。