我在谷歌搜索这些模式,发现我们可以为Factory
创建一个Abstract factories
,这真的很有意义。对我来说,我将以下示例从一些C ++书籍中提炼出来。
想象一下,我们在游戏应用程序中有两个抽象类:Monster
和SuperMonster
。
在困难的水平上,我们也有他们的实施:
对于SillyMonster
s,MediumMonster
,HardMonster
和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
而不是具体的对象,而这些对象又创建了具体的对象。我找不到更多或更不明智的例子......
答案 0 :(得分:1)
如果您使用AbstractEnemyFactoryFactory
创建AbstractEnemyFactory
,那么您将再次发现自己的问题"谁将负责创建适当的{{1} }}&#34 ;?然后你可能会尝试创建另一个AbstractEnemyFactoryFactory
等等......
拥有AbstractFactory模式意味着在某个地方,在您的应用程序中,您需要一种开关(通常由GUI输入驱动),当玩家选择游戏难度时,会创建适当的ConcreteFactory。
我所说的是将ObjectFactory封装在AbstractFactoryFactory中并不是一般的错误,但这应该在ObjectFactory不是唯一要创建的情况下完成(例如,你可能有一个如果玩家选择硬或简单模式,树木的工厂将以不同的方式创建混凝土树木。在这种情况下,AbstractFactoryFactory将处理多个Object工厂创建,它可能很有用。
但是如果EnemyFactory的创建由高级模块(GUI)直接控制,那么只需保持简单并创建AbstractEnemyFactoryFactoryFactory
或EasyLevelEnemyFactory
编辑:
澄清:在树和敌人示例之后,HardLevelEnemyFactory
创建MediumGameFactory
工厂和MediumEnemyFactory
,而MediumTreeFactory
创建EasyGameFactory
和{{1} }。这样,在您的应用程序的顶部,您只需根据游戏难度创建EasyEnemyFactory
或EasyTreeFactory
(这里是开关),这两个工厂将处理所有其余的工作。因此,您不必在整个应用程序中手动创建所有较小的工厂。