C ++中适当的工厂模式

时间:2011-01-28 16:35:37

标签: c++ oop factory-pattern std

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

namespace MySpace {

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

}

在C ++中你没有这个限制。那么将“工厂”方法作为全局函数与让它们成为一个类被认为是“不好的做法”吗?

示例1:

namespace MySpace {

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

}

示例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;
}

}

示例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;
  }
};

}

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

我之前使用过这两种情况,我不确定是否认为一个人比其他人更好“

4 个答案:

答案 0 :(得分:3)

您可以根据标准库中的用法假设命名空间的全局工厂不是隐式错误。没有什么能阻止它正确。

您在工作中包装工厂的方法是组织更改。组织本身既不好也不坏。它可以做得很好或很差。

你应该做任何适合其背景的方法。我也看到这两种方法都使用了很多次,而且都没有特别成问题。

答案 1 :(得分:1)

我仍然建议将这些功能放入一个类中(甚至将它们设置为虚拟)。由于各种原因能够更换工厂非常好,而且这样做会使这更容易。

在标准库中,工厂函数很大程度上存在,因为函数模板扩展可以基于参数的类型,但是在C ++ 17之前,您不能拥有基于馈送类型创建类实例的模板类到构造函数。因此,那些工厂功能被认为是非成员构造函数而不是工厂。例如,它们总是返回特定类型的实例。

在'true'工厂中,工厂可以返回任何实现指定接口的类型或从指定类型派生的类型。真正的工厂总是返回指针或(在极少数情况下)引用,但不是实际的实例。

答案 2 :(得分:0)

以下是在c ++中实现单例的方法示例 这样你可以避免全球化 希望这可以帮助。

 /* header file */

#ifndef EXAMPLE_H
#define EXAMPLE_H

class example
{
private:
    example(); // constructor
public:
    ~example(); // destructor
    static example *getExampleObject();
}
#endif

/* cpp file */
#include "example.h"

example *example::getExampleObject()
{
    static example *theInstance = NULL;
    if(theInstance == NULL)
    {
        theInstance = new example();
    }
    return theInstance;
}

答案 3 :(得分:0)

C ++中的自由函数很好,我会选择那条路。

有些无关:为什么要从工厂返回共享智能指针?是否总是要共享新创建的对象的所有权?