Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有属性问题的对象工厂?_C++_Design Patterns_Scripting - Fatal编程技术网

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++?