2015-04-04 135 views
2

我在Google上搜索这个模式,发现我们可以为Abstract factories创建一个Factory,这真的很有意义。对我来说,我从一些C++书籍中学习了以下示例。为工厂创建抽象工厂是否有意义?

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

Depedning的难易程度,我们也有自己的实现: SillyMonsterMediumMonsterHardMonster等为SuperMonster秒。

所以,现在我们可以创建一个相同的基三班对象工厂:

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 s而不是具体的对象,而这些具体的对象又创建具体的对象。如果您在“谁是要采取建立选择恰当的AbstractEnemyFactoryFactory照顾”的问题再次使用AbstractEnemyFactoryFactory创建AbstractEnemyFactory,那么你会发现自己我找不到更多或更少的明智例如...

+0

为什么你害怕这样的解决方案?我认为,从面向对象的角度来看,它不仅仅是可以接受的...... – 2015-04-04 15:12:06

回答

1

?然后,您可以尝试创建另一个AbstractEnemyFactoryFactoryFactory依此类推......

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

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

但如果EnemyFactory创建直接由高层模块(GUI),那么就保持它的简单和创建EasyLevelEnemyFactoryHardLevelEnemyFactory

编辑控制:

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

+0

谢谢你的回答,但你树木的例子不是很清楚。你的意思是说,我们有'说'MediumGameFactory','EasyGameFactory'等等,然后封装'MediumEnemyFactory' - abstractFactory,'TreeFactory' --Object Factory? – 2015-04-04 15:24:06

+0

是的,请参阅编辑答案 – gcswoosh 2015-04-04 15:30:53