c++ - 具有抽象参数的抽象工厂?

标签 c++ factory-pattern

我正在尝试使用抽象工厂设计一个良好的实体创建系统(根据 http://www.dofactory.com/Patterns/PatternAbstract.aspx ),但在涉及到实例特定参数时我遇到了困难。

例如: 我有两个抽象工厂,一个用于创建射弹,一个用于创建 crate

现在工厂可以是每种类型的一个实例,它从列表中传递一个抽象参数集(在基类中将共享 Material 、尺寸等),类型特定参数将是射弹的速度和 crate 的耐用性。

但我正在努力解决的是,最后当我有这个抽象工厂方法时,我用字符串“BulletProjectile”和“WeakCrate”等参数调用,我需要提供实例特定参数,更重要的是对于不同的工厂,它们有不同的类型——对于射弹,它们会有位置和速度,而 crate 只会有位置。 更糟糕的情况是当用户或玩家正在创建 crate 或类似对象时,并且能够定义其尺寸。我该如何处理?

最佳答案

几个选项:

重新考虑您的用法

如果抽象工厂将工厂的用户与具体类型的生成方式分开,那么它是有用的。抽象工厂对它生产的东西没有任何限制,只是它是抽象的。它可以返回非抽象类型,或不在继承层次结构最底层的抽象类型。

如果使用工厂的代码已经可以获取不同的数据集来调用工厂,那么使用工厂的代码已经对从中产生的类型有所了解。

这里有一些可供考虑的选项:

  • 提供多个抽象工厂类型,其中一个 Create每个方法,例如 GrenadeFactory和一个 BulletFactory
  • 为单个抽象工厂类型提供多个方法,例如CreateBulletCreateGrenade
  • 停止使用抽象工厂。如果您真的不需要抽象构造,而只需要抽象类型,这是一个不错的选择。

请记住,您仍然可以将派生类型 ( Bullet ) 传递给采用基类型(例如 EntityProjectile )的方法。

双重 dispatch

如果您真的对将抽象工厂与抽象参数结合起来一筹莫展,那么您可能需要研究双重分派(dispatch),或者 Visitor Pattern .这里的关键是您要尝试将两种不同的虚拟方法相互组合,并根据这两种派生类型获得独特的行为组合。

这将要求您为参数创建基本类型和派生类型,因此如果不创建从基本类型派生的自定义参数结构,就无法传递简单类型(如 int、string 等)Parameters类型。

它还需要大量额外的代码来实现访问者模式。

RTTI

你可以使用 the C++ Run-Time Type Information feature .

使用 dynamic_cast ,您可以将基类型转换为派生类型。您可以在工厂实现中执行此操作,将基本​​参数类型转换为特定参数类型。

与双重分派(dispatch)一样,这也需要您为参数创建类型层次结构,但需要更少的代码来将它们拼接在一起(不需要访问者模式)。

不过,此选项会将您的工厂实现与参数结构实现紧密耦合。

属性(property)袋

您还可以使用 string -> some type字典(例如 string -> boost::any)。这称为属性(property)袋。但是,它会失去很多编译时类型安全性,因为您基本上是按字符串值查找所有内容。我真的不推荐它。

关于c++ - 具有抽象参数的抽象工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241146/

相关文章:

c++ - 成员函数指针和对象工厂模式

c++ - SHOpenFolderAndSelectItems for explorer 替换程序

java - 相当于其他流行语言中的后期静态绑定(bind)(PHP)

c++ - 使用 Qt4 的简单菜单栏

c# - 扩展方法中需要工厂类

mongodb - DDD 和 MongoDB : Is it okay to let Mongo create ObjectIDs?

c++ - 我可以定义从 std::function 到 std::shared_ptr<MyClass> 的隐式转换吗?

c++ - 多重集 lower_bound 迭代器的位置

Symfony3 工厂即服务

java - 如何用UML类图表达Factory或Helper类和它能生成的对象的关系