C++ 有属性问题的对象工厂?
这只是一个一般性问题 据我所知,对象工厂只是一个程序可以创建和销毁预定义对象的地方。我也明白这会使脚本编写和网络连接更容易 我能说的模式是什么?给我一个具有这个特征和那个特征的对象?这是一种模式吗?我的一个朋友告诉我,一个对象工厂,但我似乎找不到任何关于对象工厂的信息与对象的属性。如果这是一种模式,而我不是在说废话,那么谁能给我一个好的例子,一个关于它的理论。这也是为了游戏设计 我想我只是不知道用谷歌搜索什么 谢谢 编辑: 举个简单的例子:很抱歉这个很老套的例子 我想要一艘有护盾、导弹和雷达的宇宙飞船。C++ 有属性问题的对象工厂?,c++,design-patterns,scripting,C++,Design Patterns,Scripting,这只是一个一般性问题 据我所知,对象工厂只是一个程序可以创建和销毁预定义对象的地方。我也明白这会使脚本编写和网络连接更容易 我能说的模式是什么?给我一个具有这个特征和那个特征的对象?这是一种模式吗?我的一个朋友告诉我,一个对象工厂,但我似乎找不到任何关于对象工厂的信息与对象的属性。如果这是一种模式,而我不是在说废话,那么谁能给我一个好的例子,一个关于它的理论。这也是为了游戏设计 我想我只是不知道用谷歌搜索什么 谢谢 编辑: 举个简单的例子:很抱歉这个很老套的例子 我想要一艘有护盾、导弹和雷达的宇
然后我想要一艘有曲速传动装置、护盾和大量载货空间的宇宙飞船 听起来有点像。。犯错误反模式。但听起来很像。听起来有点像。。犯错误反模式。但是它听起来很像。我能想到的唯一一个可以远程描述您正在寻找的是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;
}
EDIT:忘记了return语句。我能想到的唯一能远程描述您正在查找的内容的方法是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;
}
编辑:忘记了返回语句。所以你知道你需要一艘宇宙飞船。这艘宇宙飞船将连接不同的小工具,因此您可能需要这样的东西:
class Spaceship {
public:
void add(Gadget*);
};
可能会有不同的飞船,所以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;
};
也许你甚至不需要一个gadget层次结构:如果他们只给bonus/malus,你可以通过构造函数分配他们,你就完成了
现在,在代码的某个地方,您必须构建宇宙飞船,构建小工具并将它们连接到宇宙飞船上。请参见spaceship::add方法。我假设启动构建过程的请求将来自UI,因此您将确切地知道用户想要什么样的小工具,因为他/她将从您必须显示的列表中进行选择
最后,你将以一个宇宙飞船工厂和一个小工具工厂结束。太空船一号将有许多方法,例如
SpaceshipFactory {
public:
Spaceship* buildCargo();
Spaceship* buildWarship();
};
GadgetFactory {
public:
Gadget* buildEnhancedRadar();
Gadget* buildAntigravityCannons();
};
无论如何,在考虑代码模式之前,您需要优化设计。如果你在向别人解释你想要达到的目标时遇到困难,那么照片中仍然缺少一些东西。所以你知道你需要一艘宇宙飞船。这艘宇宙飞船将连接不同的小工具,因此您可能需要这样的东西:
class Spaceship {
public:
void add(Gadget*);
};
可能会有不同的飞船,所以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;
};
也许你会
甚至不需要gadget层次结构:如果他们只给bonus/malus,你可以通过构造函数分配它们,你就完成了
现在,在代码的某个地方,您必须构建宇宙飞船,构建小工具并将它们连接到宇宙飞船上。请参见spaceship::add方法。我假设启动构建过程的请求将来自UI,因此您将确切地知道用户想要什么样的小工具,因为他/她将从您必须显示的列表中进行选择
最后,你将以一个宇宙飞船工厂和一个小工具工厂结束。太空船一号将有许多方法,例如
SpaceshipFactory {
public:
Spaceship* buildCargo();
Spaceship* buildWarship();
};
GadgetFactory {
public:
Gadget* buildEnhancedRadar();
Gadget* buildAntigravityCannons();
};
无论如何,在考虑代码模式之前,您需要优化设计。如果你在向他人解释你试图实现的目标时遇到困难,那么图片中仍然缺少一些东西。我认为这只是一个工厂,它的创建方法有参数:
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);
或者用其他方法实现依赖关系管理,但在我看来,这只是使用带参数的工厂模式。使用工厂而不是仅仅使用对象构造函数的原因可能并不明显,但其思想是,通过使用工厂,您可以将它们声明为依赖项,并从某种配置对象注入工厂,有效地将构建逻辑从游戏逻辑中抽象出来。我想说的是,它只是一个工厂,具有创建方法的参数:
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);
或者用其他方法实现依赖关系管理,但在我看来,这只是使用带参数的工厂模式。使用工厂而不是仅仅使用对象构造函数的原因可能并不明显,但其思想是,通过使用工厂,您可以将它们声明为依赖项,并从某种配置对象注入工厂,有效地从你的游戏逻辑中抽象出构造逻辑。为什么你提到脚本,并把问题标记为C++?为什么你会提到脚本并把问题标记为C++?