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

Does it make a sense to create an Abstract Factory for factories?

我在谷歌上搜索了这个模式,发现我们可以为 Abstract factories 创建一个 Factory,这真的很有意义。对我来说,我从一些 C++ 书中借鉴了以下示例。

假设我们在游戏应用程序中有两个抽象 classes:MonsterSuperMonster

根据难度级别,我们也有他们的实现: SillyMonsterMediumMonsterHardMonster 等等 SuperMonsters。

所以现在我们可以创建三个具有相同基数的对象工厂class:

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 实现,这对我来说似乎很自然。

问题:把一个ObjectFactory封装成一个AbstractFactory有意义吗?

我的意思是我们创建了一个 Abstract Factory,它本身将创建 Object Factorie,而不是具体对象,而具体对象又在创建具体对象。我找不到或多或少明智的例子...

如果你用一个AbstractEnemyFactoryFactory创建一个AbstractEnemyFactory那么你会发现自己又陷入了"Who is going to take care of creating the approriate AbstractEnemyFactoryFactory"的问题中吗?然后你可能会尝试创建另一个 AbstractEnemyFactoryFactoryFactory 等等....

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

我的意思是,将 ObjectFactory 封装在 AbstractFactoryFactory 中通常并没有错,但是应该在 ObjectFactory 不是唯一要创建的对象的情况下这样做(例如,您可能有一个如果玩家选择困难或简单模式,树木工厂将以不同方式创建混凝土树)。在这种情况下,AbstractFactoryFactory 将处理多个对象工厂的创建,它可能很有用。

但是如果 EnemyFactory 的创建是由高级模块 (GUI) 直接控制的,那么只需保持简单并创建 EasyLevelEnemyFactoryHardLevelEnemyFactory

编辑:

澄清一下:按照树和敌人的例子,MediumGameFactory 创建了 MediumEnemyFactory 工厂和 MediumTreeFactory,而 EasyGameFactory 创建了 EasyEnemyFactoryEasyTreeFactory。这样,在您的应用程序的顶部,您只需根据游戏难度创建 MediumGameFactoryEasyGameFactory(开关来了),这两个工厂将处理所有其余的事情。因此,您不必在整个应用程序中手动创建所有较小的工厂。