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+中的抽象工厂+;_C++_Design Patterns_Abstract Factory - Fatal编程技术网

C++ C+中的抽象工厂+;

C++ C+中的抽象工厂+;,c++,design-patterns,abstract-factory,C++,Design Patterns,Abstract Factory,我试图理解抽象工厂模式,这里是我的第一个近似值: #include <iostream> using namespace std; class Soldier { public: virtual void shoot()=0; }; class Archer: public Soldier { public: void shoot(){ cout<<"Archer shoot"<<endl; } };

我试图理解抽象工厂模式,这里是我的第一个近似值:

#include <iostream>
using namespace std;

class Soldier
{
    public:
    virtual void shoot()=0;
};

class Archer: public Soldier
{
    public:
    void shoot(){
        cout<<"Archer shoot"<<endl;
    }
};

class Rider: public Soldier
{
    public:
    void shoot(){
        cout<<"Rider shoot"<<endl;
    }
};

class AbstractFactory
{
    public:
    virtual Soldier* createArcher()=0;
    virtual Soldier* createRider()=0;
};

class OrcFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer();
    };
    Soldier* createRider()
    {
        return new Rider();
    };
};

class HumanFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer();
    };
    Soldier* createRider()
    {
        return new Rider();
    };
};

class Game
{

    public:
    AbstractFactory* factory;
    Game(AbstractFactory* factory):factory(factory){};
};

int main()
{
    Game* game = new Game(new HumanFactory);
    Archer* HumanArcher = static_cast <Archer*>(game->factory->createArcher());
    Rider* humanRider = static_cast <Rider*>(game->factory->createRider());
    HumanArcher->shoot();
    humanRider->shoot();
    return 0;
}
#包括
使用名称空间std;
班兵
{
公众:
虚空射击()=0;
};
弓箭手:公共士兵
{
公众:
空射(){

cout这并不是构成一个图像的确切原因。在您的情况下,您需要这样的结构(该图最终有点太大,请单击图像以其原始分辨率查看):

其思想是,您有一系列抽象类或接口(这里是units、archer、rider等)和一系列针对每种工厂类型的具体实现(针对人类的实现、针对ORC的实现等)。游戏只使用抽象工厂界面,不需要关心实际类型,而每个实现只需要提供自己的行为,便于扩展


作为一个旁注,我在图表中使用,因为C++支持它(与C语言相反),在这种情况下它似乎是有意义的。(例如,基本工厂界面

SoldierFactory
中的方法
makeArcher
声明为返回
Archer
对象,但
OrcSoldierFactory
中的相同方法返回
OrcArcher
),但这并不是模式严格要求的。

也许代码检查是问这个问题的更好地方。如果士兵的属性在兽人和人类之间设置不同,这会更有意义。@dandan78我不太确定,这看起来像是一个假设场景的练习,某种代码检查。这绝对不是代码使用在生产中,它没有做任何有用的事情。你可能会感兴趣。虽然使用C#示例,但它说明了为什么游戏规则会为OOP语言制定糟糕的语言规则。我不认为这是离题的,OP在理解和实现特定情况下的设计模式时遇到了问题,而不是询问其实现的质量离子,我不认为这是一个重复的工厂与抽象工厂的问题…谢谢,非常有用的信息,检查它