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。
我之前使用过这两种情况,我不确定是否认为一个人比其他人更好“
答案 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 ++中的自由函数很好,我会选择那条路。
有些无关:为什么要从工厂返回共享智能指针?是否总是要共享新创建的对象的所有权?