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