c++ - C++ 中的抽象工厂

标签 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;
    }
};

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;
}

这是我要复制的内容:

class diagram

我有编程经验,但我是模式方面的新手,不确定这是否是最佳解决方案,甚至不确定它是否是一个好的解决方案。

我正在阅读有关游戏引擎架构的内容,但我被困在这个问题上,不是因为错误,只是怀疑这个练习的正确解决方案。这本书有基本的例子,但根本不足以理解它。

最佳答案

这并不是 abstract factory 的真正原因.在您的情况下,您需要这样的结构(图表最终有点太大,单击图像以原始分辨率查看):

Abstract factory pattern

这个想法是你有一组抽象类或接口(interface)(这里是单位、弓箭手、骑手等)和一组针对每种类型工厂的具体实现(人类的实现、兽人的实现等)。 ).游戏只使用抽象工厂接口(interface),不需要关心实际类型是什么,而每个实现只需要提供自己的行为,便于扩展。

作为旁注,我使用了 covariant return types在图中,因为 C++ 支持它(例如,与 C# 相对),并且在这种情况下似乎有意义(例如,基本工厂接口(interface) SoldierFactory 中的方法 makeArcher > 被声明为返回一个 Archer 对象,但 OrcSoldierFactory 中的相同方法返回一个 OrcArcher),但这并不是模式严格要求的.

关于c++ - C++ 中的抽象工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48261630/

相关文章:

c++ - 模板复制构造函数出错

c++ - 自动/静态内存分配

java - 抽象工厂

c# - 如何重构程序代码?

c# - 对带参数的抽象工厂进行单元测试

design-patterns - DAO/抽象工厂模式——多数据源

c++ - 当保护保护太多

c++ - 但是将内存转换为字节数组?

java - 我们如何创建工厂模式来返回 Spring bean

java - 在下面的示例中使用抽象工厂而不是工厂方法有什么真正的好处?