C++ 为工厂创建抽象工厂有意义吗?

C++ 为工厂创建抽象工厂有意义吗?,c++,design-patterns,factory,abstract-factory,C++,Design Patterns,Factory,Abstract Factory,我在谷歌上搜索这个模式,发现我们可以为抽象工厂创建工厂,这真的很有意义。对我来说,下面的例子是从一些C++书籍中得出的。p> 假设我们在一个游戏应用程序中有两个抽象类:Monster和SuperMonster 根据困难程度,我们也有他们的实施: sillymonester,MediumMonster和hardmonester等等 现在我们可以用相同的基类创建三个对象工厂: class AbstractEnemyFactory { public: virtual Soldier* Make

我在谷歌上搜索这个模式,发现我们可以为
抽象工厂创建
工厂
,这真的很有意义。对我来说,下面的例子是从一些C++书籍中得出的。p> 假设我们在一个游戏应用程序中有两个抽象类:
Monster
SuperMonster

根据困难程度,我们也有他们的实施:
sillymonester
MediumMonster
hardmonester
等等

现在我们可以用相同的基类创建三个对象工厂:

class AbstractEnemyFactory
{
public:
    virtual Soldier* MakeSoldier() = 0;
    virtual Monster* MakeMonster() = 0;
    virtual SuperMonster* MakeSuperMonster() = 0;
};

class EasyLevelEnemyFactory : public AbstractEnemyFactory
{
public:
    Monster* MakeMonster()
    { 
        return new SillyMonster; 
    }
    SuperMonster* MakeSuperMonster()
    { 
        return new SillySuperMonster; 
    }
};

//The other two factories
在我看来,如果我们创建
AbstractEnemyFactoryFactory
,它将根据玩家在运行时选择的级别创建一个合适的
AbstractEnemyFactory
实现,这是很自然的

问题:
对象工厂
封装为
抽象工厂
有意义吗


我的意思是我们创建一个
抽象工厂
,它本身将创建
对象分解
s,而不是创建具体对象的具体对象。我找不到多少合理的例子…

如果您使用
AbstractEnemyFactory
创建
AbstractEnemyFactory
,那么您将再次陷入“谁将负责创建合适的
AbstractEnemyFactory
”的问题中?然后您可能会尝试创建另一个
AbstractEnemyFactoryFactoryFactory
等等

拥有一个AbstractFactory模式意味着,在应用程序的某个地方,您将需要一种开关(通常由GUI输入驱动),当玩家在您的案例中选择游戏难度时,该开关将创建适当的具体工厂

我想说的是,在AbstractFactoryFactory中加入ObjectFactory通常不是错误的,但这应该在ObjectFactory不是唯一要创建的情况下进行(例如,如果玩家选择硬模式或简单模式,您可能有一个树工厂,它将以不同的方式创建具体的树)。在这种情况下,AbstractFactoryFactory将处理多个对象工厂的创建,它可能很有用

但是,如果EnemyFactory的创建是由高级模块(GUI)直接控制的,那么只需简单地创建
EasyLevel EnemyFactory
HardLevel EnemyFactory

编辑:


澄清:以树和敌人为例,
MediumGameFactory
创建
MediumEnemyFactory
工厂和
MediumTreeFactory
,而
EasyGameFactory
创建
EasyEnemyFactory
。这样,在应用程序的顶部,您只需根据游戏难度创建
MediumGameFactory
EasyGameFactory
,这两个工厂将处理其余的所有工作。因此,您不必在整个应用程序中手动创建所有较小的工厂。

您为什么害怕这种解决方案?我认为,从OO范式的角度来看,这是完全可以接受的…谢谢你的回答,但你的例子与树不是很清楚,我。你的意思是说我们有,比如说,
MediumGameFactory
EasyGameFactory
等等,它们反过来可能会封装
MediumEnemyFactory
——抽象工厂,
TreeFactory
——对象工厂?