对象工厂有属性问题?

时间:2010-12-22 19:19:44

标签: c++ design-patterns scripting

这只是一个普遍的问题。

据我了解,对象工厂只是程序可以制作和销毁预定义对象的地方。我也理解这使脚本和网络更容易。

我可以说什么模式给我一个具有此功能和该功能的对象?是这样的模式吗?我的一个朋友告诉我一个对象工厂,但我似乎无法找到具有该对象属性的对象工厂的任何信息。如果这是一种模式,我不是在说垃圾,任何人都可以给我一个很好的例子,关于它的理论。这也是游戏设计的观点。

我想我不知道谷歌会怎么做。

感谢。

修改
快速示例:抱歉相当陈旧的例子
我想要一艘装有盾牌,导弹和雷达的宇宙飞船 然后我想要一艘带有经线驱动,盾牌和大量货物空间的宇宙飞船。

4 个答案:

答案 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);

或者您以其他方式实现依赖关系管理,但仍然是我看到它的方式,这只是使用带参数的工厂模式。使用工厂而不仅仅使用对象构造函数的原因可能并不明显,但是想法是通过使用工厂,您可以将它们声明为依赖项并从某种配置对象中注入工厂,从而有效地从您的构造逻辑中抽象出构造逻辑游戏逻辑。