为工厂创建抽象工厂是否有意义?

时间:2015-04-04 14:45:10

标签: c++ design-patterns factory abstract-factory

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

想象一下,我们在游戏应用程序中有两个抽象类:MonsterSuperMonster

在困难的水平上,我们也有他们的实施:  对于SillyMonster s,MediumMonsterHardMonsterSuperMonster等等。

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

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而不是具体的对象,而这些对象又创建了具体的对象。我找不到更多或更不明智的例子......

1 个答案:

答案 0 :(得分:1)

如果您使用AbstractEnemyFactoryFactory创建AbstractEnemyFactory,那么您将再次发现自己的问题"谁将负责创建适当的{{1} }}&#34 ;?然后你可能会尝试创建另一个AbstractEnemyFactoryFactory等等......

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

我所说的是将ObjectFactory封装在AbstractFactoryFactory中并不是一般的错误,但这应该在ObjectFactory不是唯一要创建的情况下完成(例如,你可能有一个如果玩家选择硬或简单模式,树木的工厂将以不同的方式创建混凝土树木。在这种情况下,AbstractFactoryFactory将处理多个Object工厂创建,它可能很有用。

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

编辑:

澄清:在树和敌人示例之后,HardLevelEnemyFactory创建MediumGameFactory工厂和MediumEnemyFactory,而MediumTreeFactory创建EasyGameFactory和{{1} }。这样,在您的应用程序的顶部,您只需根据游戏难度创建EasyEnemyFactoryEasyTreeFactory(这里是开关),这两个工厂将处理所有其余的工作。因此,您不必在整个应用程序中手动创建所有较小的工厂。