这只是一个普遍的问题。
据我了解,对象工厂只是程序可以制作和销毁预定义对象的地方。我也理解这使脚本和网络更容易。
我可以说什么模式给我一个具有此功能和该功能的对象?是这样的模式吗?我的一个朋友告诉我一个对象工厂,但我似乎无法找到具有该对象属性的对象工厂的任何信息。如果这是一种模式,我不是在说垃圾,任何人都可以给我一个很好的例子,关于它的理论。这也是游戏设计的观点。
我想我不知道谷歌会怎么做。
感谢。
修改
快速示例:(抱歉相当陈旧的例子)
我想要一艘装有盾牌,导弹和雷达的宇宙飞船
然后我想要一艘带有经线驱动,盾牌和大量货物空间的宇宙飞船。
答案 0 :(得分:3)
所以你知道你需要一艘宇宙飞船。这艘宇宙飞船将附加不同的小工具,所以你可能需要这样的东西:
class Spaceship {
public:
void add(Gadget*);
};
也许会有不同的船只,因此Spaceship将成为层次结构的基类。例如,你将有侦察船,战舰,快速拦截器等等。
至于小工具,也许它们会增强宇宙飞船的某些属性,所以你需要提前知道它们 。我猜他们会有最高速度,货物容量等等。我会将它们添加到Spaceship类中,它看起来像:
class Spaceship {
public:
void add(Gadget*);
long getMaxSpeed() const;
long getCargoCapacity() const;
long getRadarRange() const;
};
每个太空飞船都会为此属性提供不同的基本值,您可以根据已安装的小工具进行更改。因此,他们会给所述房产提供奖金或奖金:
class SpaceshipGadget {
public:
long getSpeedBonus() const; // this can be positive or negative
long getCargoBonus() const;
long getRadarBonus() const;
};
也许你甚至不需要小工具层次结构:如果他们只给予奖金/ malus你可以通过构造函数分配它们并且你已经完成了。
现在,在代码中的某个地方,您必须构建太空飞船,构建小工具并将它们附加到太空船上(请参阅Spaceship::add
方法)。我认为启动构建过程的请求将来自UI,因此您将准确了解用户想要的小工具类型,因为他/她将从您必须显示的列表中进行选择。
最后,您将找到一个太空船工厂和一个小工厂。宇宙飞船将有许多方法,如
SpaceshipFactory {
public:
Spaceship* buildCargo();
Spaceship* buildWarship();
};
GadgetFactory {
public:
Gadget* buildEnhancedRadar();
Gadget* buildAntigravityCannons();
};
无论如何,在考虑代码模式之前,您需要优化设计。如果你无法向别人解释你想要达到的目标,那么图片中仍然缺少一些东西。
答案 1 :(得分:2)
我能想到的唯一想法是甚至远程描述你正在寻找的是QueryInterface
,在COM中使用,你指定一个类型,如果对象可以产生一个从该接口继承的对象,它确实。
除此之外,你说的话没有任何意义。你不能只是向工厂询问一个从X接口继承的对象,或者其他类似的东西。
编辑:
哦,我明白了。这与对象工厂完全无关。完全没有。你想要做的是按照他们的属性订购宇宙飞船,然后进行简单的搜索。可以使用位掩码和尝试来快速实现这一点,但是我会为没有排序的非常低效的版本显示代码。
class Spaceship {
std::vector<std::string> properties;
public:
bool HasProperty(string property) {
for(int i = 0; i < properties.size(); i++) {
if (properties[i] == property)
return true;
}
return false;
}
};
std::vector<Spaceship*> GetShipsWithPropertiesFromList(std::vector<std::string> properties, std::vector<Spaceship*> spaceships) {
for(int i = 0; i < properties.size(); i++) {
std::vector<Spaceship*> list;
for(int j = 0; j < spaceships.size(); j++) {
if (spaceships[j]->HasProperty(properties[i]))
list.push_back(spaceships[j]);
}
spaceships = list;
}
return spaceships;
}
编辑:忘记返回声明。
答案 2 :(得分:1)
听起来有点像..错误..反模式。但它听起来与service locator pattern类似。
答案 3 :(得分:1)
我会说它只是一个带有创建方法参数的工厂:
class ShipFactory
{
function Create(Shield shield, WeaponConfiguration weapons, Engine engine)
{
// Return an instance with the appropriate configuration
}
}
依赖关系(盾牌等)可能是使用他们自己的工厂创建的:
class ShieldFactory
{
function Shield Create();
}
class WeaponsFactory
{
function WeaponConfiguration Create();
}
class EngineFactory
{
function Engine Create();
}
导致类似:
shield = shieldFactory.Create();
weapons = weaponsFactory.Create();
engine = engineFactory.Create();
ship = shipFactory.Create(shield, weapons, engine);
或者您以其他方式实现依赖关系管理,但仍然是我看到它的方式,这只是使用带参数的工厂模式。使用工厂而不仅仅使用对象构造函数的原因可能并不明显,但是想法是通过使用工厂,您可以将它们声明为依赖项并从某种配置对象中注入工厂,从而有效地从您的构造逻辑中抽象出构造逻辑游戏逻辑。