我正在按照上一个问题的回复中的建议来实现Factory类:
Factory method implementation - C++
它是一个Factory,它存储从字符串到对象创建函数的映射,因此我可以通过字符串标识符从工厂请求不同类型的对象。这个工厂生成的所有类都将继承自一个抽象类(Connection),为不同协议(HTTPConnection,FTPConnection等)的连接提供通用接口。
我很好地掌握了与上述方法相关的方法是如何工作的,并且已经开始工作。
我遇到问题的地方是试图找出一种机制来防止在不使用Factory的情况下实例化Connection对象。为了使Factory能够完成它的工作,我需要为它提供一个对象创建函数来存储它的地图。我不能提供它的构造函数,因为你不能创建构造函数的函数指针。因此,如上面的链接,必须有一个单独的对象创建函数来返回新对象。但要做到这一点,我需要使这个创建函数或者是类的静态方法,客户端代码能够访问它,或者是一个单独的函数,它需要a)Connection类的构造函数是公共的,或者b)使构造函数成为私有,并使非类成员创建函数成为朋友,它不是继承的,也不能由抽象基类强制执行。
同样,如果我只是使用Connection类创建了Factory类的朋友,那么它应该生成所以它可以访问它们的私有构造函数,这样可以工作,但我不能通过abstact基类强制执行,因为朋友不是遗传。每个子类都必须明确地与Factory建立朋友。
有人能建议实施我上面描述的方法吗?
重申要求:
1 - 生成各种对象的工厂,所有对象都基于传入的标识符从相同的基类派生到Factory的Create方法。
2 - 工厂需要生成的所有子类将自动向工厂注册创建函数和标识符(参见上面链接的SO答案)
3 - 工厂生产的所有子类都不应该是可实例化的(可实例化的?)而不经过工厂
4 - 使用继承将#3显式强制作为抽象基类的一部分。删除了某人从抽象基类继承的可能性,同时还提供了自由实例化对象的机制。
我想要实现的目标的总体目标是允许将新的Connection类型添加到层次结构中,而不必以任何方式更改Factory类,同时还强制Connection的所有子类不能直接实例化通过客户端代码。
我很可能认为这不是实现我想要的最佳方式,欢迎提出其他替代方案的建议。
编辑 - 当我回到家时希望更清楚地添加一些代码片段。
答案 0 :(得分:1)
如果我理解正确,我认为你可以在我链接到的答案中提到的METADECL
宏中放置你想要的一些内容,即定义一个朋友的静态创建者函数或者将其声明为静态方法。这将使您可以限制构造函数的公共使用等。
下面我尝试指出METADECL
(和METAIMPL
)应该在哪里。我留给你实现你需要的东西(我相信你)
标头文件
class MySubClass : public FactoryObjectsRoot {
METADECL(MySubClass) // Declare necessary factory construct
:
:
};
源文件
METAIMPL(MySubClass) // Implement and bootstrap factory construct