为工厂创建抽象工厂有意义吗?
Does it make a sense to create an Abstract Factory for factories?
我在谷歌上搜索了这个模式,发现我们可以为 Abstract factories
创建一个 Factory
,这真的很有意义。对我来说,我从一些 C++ 书中借鉴了以下示例。
假设我们在游戏应用程序中有两个抽象 classes:Monster
和 SuperMonster
。
根据难度级别,我们也有他们的实现:
SillyMonster
、MediumMonster
和 HardMonster
等等 SuperMonster
s。
所以现在我们可以创建三个具有相同基数的对象工厂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) 直接控制的,那么只需保持简单并创建 EasyLevelEnemyFactory
或 HardLevelEnemyFactory
编辑:
澄清一下:按照树和敌人的例子,MediumGameFactory
创建了 MediumEnemyFactory
工厂和 MediumTreeFactory
,而 EasyGameFactory
创建了 EasyEnemyFactory
和 EasyTreeFactory
。这样,在您的应用程序的顶部,您只需根据游戏难度创建 MediumGameFactory
或 EasyGameFactory
(开关来了),这两个工厂将处理所有其余的事情。因此,您不必在整个应用程序中手动创建所有较小的工厂。
我在谷歌上搜索了这个模式,发现我们可以为 Abstract factories
创建一个 Factory
,这真的很有意义。对我来说,我从一些 C++ 书中借鉴了以下示例。
假设我们在游戏应用程序中有两个抽象 classes:Monster
和 SuperMonster
。
根据难度级别,我们也有他们的实现:
SillyMonster
、MediumMonster
和 HardMonster
等等 SuperMonster
s。
所以现在我们可以创建三个具有相同基数的对象工厂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) 直接控制的,那么只需保持简单并创建 EasyLevelEnemyFactory
或 HardLevelEnemyFactory
编辑:
澄清一下:按照树和敌人的例子,MediumGameFactory
创建了 MediumEnemyFactory
工厂和 MediumTreeFactory
,而 EasyGameFactory
创建了 EasyEnemyFactory
和 EasyTreeFactory
。这样,在您的应用程序的顶部,您只需根据游戏难度创建 MediumGameFactory
或 EasyGameFactory
(开关来了),这两个工厂将处理所有其余的事情。因此,您不必在整个应用程序中手动创建所有较小的工厂。