没有工厂就无法实例化的参数化工厂和产品类

2023-12-19

我正在按照对上一个问题的回答中提出的内容来实现 Factory 类:

工厂方法实现 - C++ https://stackoverflow.com/questions/410823/factory-method-implementation-c/534396#534396

它是一个工厂,存储从字符串到对象创建函数的映射,因此我可以通过字符串标识符从工厂请求不同类型的对象。该工厂生成的所有类都将从抽象类(Connection)继承,为不同协议(HTTPConnection、FTPConnection 等)上的连接提供通用接口。

我很好地掌握了与上述相关的方法是如何工作的,并且已经开始工作了。

我遇到问题的地方是试图找出一种机制来防止在不使用工厂的情况下实例化连接对象。为了让工厂完成它的工作,我需要为它提供一个对象创建函数来存储在它的映射中。我无法向其提供构造函数,因为您无法将函数指针指向构造函数。因此,如上面的链接所示,必须有一个单独的对象创建函数来返回新对象。但要做到这一点,我需要使这个创建函数要么成为客户端代码能够访问的类的静态方法,要么成为一个单独的函数,这需要 a) Connection 类的构造函数是公共的,或者 b) 将构造函数设置为私有,并将非类成员创建函数设置为友元,该函数不是继承的,也不能由抽象基类强制执行。

同样,如果我只是将 Factory 类与它应该生成的 Connection 类建立为友元,这样它就可以访问它们的私有构造函数,这会起作用,但我无法通过抽象基类强制执行,因为友元不是继承的。每个子类都必须明确地成为工厂的朋友。

谁能建议一种实现我上面描述的方法?

重申一下要求:

1 - 工厂根据传递给工厂的 Create 方法的标识符生成所有派生自同一基类的各种对象。

2 - 工厂需要生成的所有子类将自动向工厂注册创建函数和标识符(请参阅上面链接的 SO 答案)

3 - 工厂将产生的所有子类不应该在不经过工厂的情况下被实例化(可实例化?)

4 - 使用继承显式强制 #3 作为抽象基类的一部分。消除了某人从抽象基类派生子类的可能性,同时还提供了自由实例化对象的机制。

我想要实现的总体目标是允许将新的 Connection 类型添加到层次结构中,而无需以任何方式更改 Factory 类,同时还强制 Connection 的所有子类不能直接由客户端代码实例化。

我愿意接受这样的可能性:这不是实现我想要的目标的最佳方式,并且欢迎提出其他替代方案的建议。

编辑 - 当我回家时将添加一些代码片段,希望使这一点更清楚。


如果我理解正确的话,我想你可以把你想要的一些东西放在METADECL我在你链接的答案中提到了宏,即定义一个静态创建者函数,它是一个朋友或将其声明为静态方法。这将使您可以限制构造函数的公共使用等。

下面我尝试指出METADECL (and METAIMPL) 应该。我把它留给你去实现你需要的东西(我相信你)

头文件

class MySubClass : public FactoryObjectsRoot {
    METADECL(MySubClass) // Declare necessary factory construct
    :
    :
};

源文件

METAIMPL(MySubClass) // Implement and bootstrap factory construct 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有工厂就无法实例化的参数化工厂和产品类 的相关文章

随机推荐